diff --git a/.github/workflows/pr-evaluation-ts.yaml b/.github/workflows/pr-evaluation-ts.yaml
new file mode 100644
index 0000000000..045d857bb0
--- /dev/null
+++ b/.github/workflows/pr-evaluation-ts.yaml
@@ -0,0 +1,133 @@
+name: pr-evaluation-ts
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - "evaluation/typescript/**"
+ - "!**/**.md"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+env:
+ NODE_VERSION: 20
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN || '' }}
+ EVALUATION_DIRECTORY: "evaluation/typescript"
+
+jobs:
+ install-dependencies:
+ name: Install dependencies
+ defaults:
+ run:
+ working-directory: ${{ env.EVALUATION_DIRECTORY }}
+ runs-on: ubuntu-latest
+ outputs:
+ YARN_CACHE_DIR: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ - name: Set yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
+ - uses: actions/cache@v4
+ id: yarn-cache
+ with:
+ path: |
+ **/node_modules
+ **/.eslintcache
+ ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: Init
+ run: make init
+
+ lint:
+ name: Lint
+ defaults:
+ run:
+ working-directory: ${{ env.EVALUATION_DIRECTORY }}
+ needs: install-dependencies
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ - uses: actions/cache@v4
+ id: yarn-cache
+ with:
+ path: |
+ **/node_modules
+ **/.eslintcache
+ ${{ needs.install-dependencies.outputs.YARN_CACHE_DIR }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: Format
+ run: make fmt
+ - name: Lint
+ run: make lint
+
+ unit-test:
+ name: Unit test
+ defaults:
+ run:
+ working-directory: ${{ env.EVALUATION_DIRECTORY }}
+ needs: install-dependencies
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ - uses: actions/cache@v4
+ id: yarn-cache
+ with:
+ path: |
+ **/node_modules
+ **/.eslintcache
+ ${{ needs.install-dependencies.outputs.YARN_CACHE_DIR }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: Install Protoc
+ uses: arduino/setup-protoc@v3
+ - name: Generated proto code
+ run: make gen_proto
+ - name: Unit test
+ run: make test
+
+ build:
+ name: Build
+ defaults:
+ run:
+ working-directory: ${{ env.EVALUATION_DIRECTORY }}
+ needs: install-dependencies
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ - uses: actions/cache@v4
+ id: yarn-cache
+ with:
+ path: |
+ **/node_modules
+ **/.eslintcache
+ ${{ needs.install-dependencies.outputs.YARN_CACHE_DIR }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: Install Protoc
+ uses: arduino/setup-protoc@v3
+ - name: Generated proto code
+ run: make gen_proto
+ - name: Package Build
+ run: make build
\ No newline at end of file
diff --git a/.github/workflows/pr-go.yaml b/.github/workflows/pr-go.yaml
index 2b2f08aec3..b3cbf16f89 100644
--- a/.github/workflows/pr-go.yaml
+++ b/.github/workflows/pr-go.yaml
@@ -8,6 +8,7 @@ on:
paths-ignore:
- "ui/**"
- "**/**.md"
+ - "evaluation/typescript/**"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 5fdd88304e..c3f1463970 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "1.1.0"
+ ".": "1.2.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 89bd954074..6f0a014988 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,113 @@
# Changelog
+## [1.2.0](https://github.com/bucketeer-io/bucketeer/compare/v1.1.0...v1.2.0) (2025-01-22)
+
+
+### Features
+
+* add connection type to goal, query connections when getting goal ([#1456](https://github.com/bucketeer-io/bucketeer/issues/1456)) ([5d01e7f](https://github.com/bucketeer-io/bucketeer/commit/5d01e7fdf76c2bbb80958ba734be9417fc867811))
+* add disabled field for push ([#1406](https://github.com/bucketeer-io/bucketeer/issues/1406)) ([c93b443](https://github.com/bucketeer-io/bucketeer/commit/c93b4436322f6bf9735262e46b218673cc196e8b))
+* add organization_id condition for list api key ([#1373](https://github.com/bucketeer-io/bucketeer/issues/1373)) ([e803651](https://github.com/bucketeer-io/bucketeer/commit/e803651c666df643b690c4f6a0fe9f620ee7ddab))
+* add tag deleter ([#1469](https://github.com/bucketeer-io/bucketeer/issues/1469)) ([6558bd0](https://github.com/bucketeer-io/bucketeer/commit/6558bd018b061f6f7e4fc1d4b6643fdded466da6))
+* add tag domain and storage implementation ([#1433](https://github.com/bucketeer-io/bucketeer/issues/1433)) ([a2078e5](https://github.com/bucketeer-io/bucketeer/commit/a2078e5caae9fc91adf6fbce6987f2ffab7c0f3d))
+* add tag service ([#1443](https://github.com/bucketeer-io/bucketeer/issues/1443)) ([bf69850](https://github.com/bucketeer-io/bucketeer/commit/bf698501b56428193c3075e69929ccb959c9bdf4))
+* code reference API ([#1395](https://github.com/bucketeer-io/bucketeer/issues/1395)) ([6b2ae5f](https://github.com/bucketeer-io/bucketeer/commit/6b2ae5fbae3d8613b57251e2e30bcbac5c627d49))
+* evaluation logic in typescript for nodejs sdk ([#1258](https://github.com/bucketeer-io/bucketeer/issues/1258)) ([d56ebab](https://github.com/bucketeer-io/bucketeer/commit/d56ebab312387cdb7cf3fdb8acb28ffa064e1745))
+* expose http protocol for push APIs ([#1379](https://github.com/bucketeer-io/bucketeer/issues/1379)) ([e5b077a](https://github.com/bucketeer-io/bucketeer/commit/e5b077a9a8a17b64c00bcb25f027f4b0a8d7c44d))
+* implement create, list, get goal REST api no command ([#1445](https://github.com/bucketeer-io/bucketeer/issues/1445)) ([8b24d8e](https://github.com/bucketeer-io/bucketeer/commit/8b24d8e13a04414f5e53192c48ab60ba153b7d4c))
+* implement http get and create notification apis, remove command patterns from create and delete apis ([#1394](https://github.com/bucketeer-io/bucketeer/issues/1394)) ([d330622](https://github.com/bucketeer-io/bucketeer/commit/d33062225e43d6e238286ae80ca0e0088a0cb8b3))
+* implement public API create and update account ([#1376](https://github.com/bucketeer-io/bucketeer/issues/1376)) ([1764266](https://github.com/bucketeer-io/bucketeer/commit/1764266130665985da50e6c2181caa508c328eb9))
+* implement REST bulk download segment users ([#1448](https://github.com/bucketeer-io/bucketeer/issues/1448)) ([03efd5d](https://github.com/bucketeer-io/bucketeer/commit/03efd5d7c08dc71477e3c3b0d786094f50632759))
+* implement REST get segment, list segments, create segment ([#1418](https://github.com/bucketeer-io/bucketeer/issues/1418)) ([8608fe3](https://github.com/bucketeer-io/bucketeer/commit/8608fe38b5d34c7c5e5bb1dcfc2e8c4664c54037))
+* implement REST list tags [#1408](https://github.com/bucketeer-io/bucketeer/issues/1408) ([4a7fd14](https://github.com/bucketeer-io/bucketeer/commit/4a7fd14b3b6ca80886f3afcbc3955d9fb3b88115))
+* implement rest update and delete segment REST ([#1441](https://github.com/bucketeer-io/bucketeer/issues/1441)) ([18bfb03](https://github.com/bucketeer-io/bucketeer/commit/18bfb036e90cc4294ae7f912b3db11feaf750045))
+* implement save api key as editor mechanism ([#1352](https://github.com/bucketeer-io/bucketeer/issues/1352)) ([fa2e6cf](https://github.com/bucketeer-io/bucketeer/commit/fa2e6cf0e71cf58651e307d60f0a4a54ef872903))
+* init http route and remove command pattern for update notification ([#1396](https://github.com/bucketeer-io/bucketeer/issues/1396)) ([7e31980](https://github.com/bucketeer-io/bucketeer/commit/7e3198001a0c993226c8e89baee8199d3ec29f8d))
+* return extra info of public API key and obfuscate the returned key ([#1349](https://github.com/bucketeer-io/bucketeer/issues/1349)) ([736d9a0](https://github.com/bucketeer-io/bucketeer/commit/736d9a05767577fc3c44cd14fff9867d7714d832))
+* save cache in child redis instances ([#1392](https://github.com/bucketeer-io/bucketeer/issues/1392)) ([b0b1bb4](https://github.com/bucketeer-io/bucketeer/commit/b0b1bb48a5f13039e1d3ccdb6689f14f637c671b))
+* support filter by organization_id in list subscription v2 and expose http ([#1387](https://github.com/bucketeer-io/bucketeer/issues/1387)) ([151bd30](https://github.com/bucketeer-io/bucketeer/commit/151bd302add4341c261b08a16fc97212136e8c0c))
+* **ui/dashboard:** fcm management ([#1401](https://github.com/bucketeer-io/bucketeer/issues/1401)) ([4e55a13](https://github.com/bucketeer-io/bucketeer/commit/4e55a1370996bfb25ef83215221ff9bbde9be284))
+* **ui/dashboard:** slack management ([#1402](https://github.com/bucketeer-io/bucketeer/issues/1402)) ([d7b8208](https://github.com/bucketeer-io/bucketeer/commit/d7b82086b0294ed55286e9b9d362b42452fa2b5f))
+* **ui/dashboard:** update api keys list ([#1346](https://github.com/bucketeer-io/bucketeer/issues/1346)) ([f05e58c](https://github.com/bucketeer-io/bucketeer/commit/f05e58c872add8f9c49c91b7cd89fcbc3303ec56))
+* **ui/dashboard:** user segments management ([#1426](https://github.com/bucketeer-io/bucketeer/issues/1426)) ([bd8710e](https://github.com/bucketeer-io/bucketeer/commit/bd8710e43ab2c038e771d810f91a3da85eadef4a))
+* **ui:** add goal connection type on the create goal form ([#1466](https://github.com/bucketeer-io/bucketeer/issues/1466)) ([f668d1e](https://github.com/bucketeer-io/bucketeer/commit/f668d1ec009402f37ef23a896b40442854e59ec7))
+* **ui:** add variation id to the debugger results page ([#1427](https://github.com/bucketeer-io/bucketeer/issues/1427)) ([e1f7c79](https://github.com/bucketeer-io/bucketeer/commit/e1f7c7922ef874ea965be14f2428ff07c0cf5f0b))
+* update goal REST no command ([#1464](https://github.com/bucketeer-io/bucketeer/issues/1464)) ([aeabf7e](https://github.com/bucketeer-io/bucketeer/commit/aeabf7e941c42dff88c55670aedd3e7dc1f05ceb))
+
+
+### Bug Fixes
+
+* cannot delete pfmerge key when deleting counts ([#1366](https://github.com/bucketeer-io/bucketeer/issues/1366)) ([5474107](https://github.com/bucketeer-io/bucketeer/commit/5474107eca9252c939baedfcdd6be3a6679bd36e))
+* cannot write against a read-only redis replica ([#1378](https://github.com/bucketeer-io/bucketeer/issues/1378)) ([3a29bbd](https://github.com/bucketeer-io/bucketeer/commit/3a29bbdc17c58555670971cd1ab4765589bc613d))
+* change dev container start docker system prune to images prune ([#1400](https://github.com/bucketeer-io/bucketeer/issues/1400)) ([89b4af1](https://github.com/bucketeer-io/bucketeer/commit/89b4af1659ad337ff48856669db5c48f21858620))
+* delete pfmerge key after count users ([#1375](https://github.com/bucketeer-io/bucketeer/issues/1375)) ([d4c6eec](https://github.com/bucketeer-io/bucketeer/commit/d4c6eecab185eaac20ad4ae76516c7249c53aecc))
+* info and error log level ([#1413](https://github.com/bucketeer-io/bucketeer/issues/1413)) ([ff82dbe](https://github.com/bucketeer-io/bucketeer/commit/ff82dbe23b2985524db22a682a162f613e78bd7b))
+* request method for account and environment svc ([#1409](https://github.com/bucketeer-io/bucketeer/issues/1409)) ([83fa5e3](https://github.com/bucketeer-io/bucketeer/commit/83fa5e301dc05222ae1d78a670dfd809d0c5c21c))
+* scan error on column index error in the goal api ([#1462](https://github.com/bucketeer-io/bucketeer/issues/1462)) ([0b63009](https://github.com/bucketeer-io/bucketeer/commit/0b63009f797468c0e1405388ed418b190df5ffa1))
+* subscriber logs when reporting bigquery errors ([#1397](https://github.com/bucketeer-io/bucketeer/issues/1397)) ([8f3ded4](https://github.com/bucketeer-io/bucketeer/commit/8f3ded43b0eaa9378c9f8a9ad36d759261d9d057))
+* system admin user's last seen not being updated ([#1425](https://github.com/bucketeer-io/bucketeer/issues/1425)) ([436963f](https://github.com/bucketeer-io/bucketeer/commit/436963f7d478d94c5567fff69fa8f9851e38e79f))
+* **ui/dashboard:** organization table list ([#1411](https://github.com/bucketeer-io/bucketeer/issues/1411)) ([9472d65](https://github.com/bucketeer-io/bucketeer/commit/9472d659bc2fc21cd9c4d487b337d104147f828d))
+* **ui:** debugger results text overflow ([#1453](https://github.com/bucketeer-io/bucketeer/issues/1453)) ([cd8fe36](https://github.com/bucketeer-io/bucketeer/commit/cd8fe36303c704773962bf44b602e81d2446ad8e))
+* **ui:** subscription not found when updating ([#1422](https://github.com/bucketeer-io/bucketeer/issues/1422)) ([44a5569](https://github.com/bucketeer-io/bucketeer/commit/44a55694beec589d3754863f5887f54ee82eedfc))
+* update evaluation event counter metrics to include variation ID ([#1363](https://github.com/bucketeer-io/bucketeer/issues/1363)) ([e1488a8](https://github.com/bucketeer-io/bucketeer/commit/e1488a8e926b73d9cd550b3477835b110dfa066d))
+
+
+### Miscellaneous
+
+* add disabled field to list pushes api ([#1437](https://github.com/bucketeer-io/bucketeer/issues/1437)) ([89f864f](https://github.com/bucketeer-io/bucketeer/commit/89f864f97152e80481fddfb6d1bee1aca3c29cff))
+* add environment id and name to notification and push api ([#1416](https://github.com/bucketeer-io/bucketeer/issues/1416)) ([3fe31b4](https://github.com/bucketeer-io/bucketeer/commit/3fe31b41bb5191da880713024e509fcce49f3901))
+* add environment_id label to evaluation event metrics ([#1391](https://github.com/bucketeer-io/bucketeer/issues/1391)) ([ffe8c83](https://github.com/bucketeer-io/bucketeer/commit/ffe8c8306ce8aa4a41c1703ed91ef6c858c56682))
+* add environment_id to push proto ([#1412](https://github.com/bucketeer-io/bucketeer/issues/1412)) ([1147d6f](https://github.com/bucketeer-io/bucketeer/commit/1147d6fbbfe257889b5055954fd1df79196734a8))
+* add linter to ensure lisence header ([#1393](https://github.com/bucketeer-io/bucketeer/issues/1393)) ([53bb294](https://github.com/bucketeer-io/bucketeer/commit/53bb2945bb56907c6ba875ae97d6b851a63acd06))
+* add list all environment tags storage interface ([#1467](https://github.com/bucketeer-io/bucketeer/issues/1467)) ([44af5b2](https://github.com/bucketeer-io/bucketeer/commit/44af5b25918fb132e5061faa7daf8fdc680b5b06))
+* add log for missing api key in the cache ([#1377](https://github.com/bucketeer-io/bucketeer/issues/1377)) ([ff14e70](https://github.com/bucketeer-io/bucketeer/commit/ff14e7001f06c56deab8722885edad2b3bdac464))
+* add order by feature_ids in segment list api ([#1449](https://github.com/bucketeer-io/bucketeer/issues/1449)) ([4368469](https://github.com/bucketeer-io/bucketeer/commit/4368469f7be427e4326b160b7bf1d6426121c16e))
+* add order by users in segment list api ([#1450](https://github.com/bucketeer-io/bucketeer/issues/1450)) ([cfe76a0](https://github.com/bucketeer-io/bucketeer/commit/cfe76a065ca62a0ff6ab4d815f9e9af1ce4b51d2))
+* add organization id to push list api ([#1424](https://github.com/bucketeer-io/bucketeer/issues/1424)) ([968c3c5](https://github.com/bucketeer-io/bucketeer/commit/968c3c5954b00cf2be56011546deaab05d5d9e88))
+* add tags column to account table ([#1454](https://github.com/bucketeer-io/bucketeer/issues/1454)) ([d5aaa2b](https://github.com/bucketeer-io/bucketeer/commit/d5aaa2b2908932f2caa98a64a18957fef3841ef4))
+* add tags field to account api proto file ([#1455](https://github.com/bucketeer-io/bucketeer/issues/1455)) ([42d1a7c](https://github.com/bucketeer-io/bucketeer/commit/42d1a7c685f295d636b46338193589ffeeae121d))
+* add transaction support for redis pipeline ([#1367](https://github.com/bucketeer-io/bucketeer/issues/1367)) ([d387ee6](https://github.com/bucketeer-io/bucketeer/commit/d387ee6af632aa87a98f1c36203c4e457ad5e5a8))
+* change environment_namespace variable name to environment_id ([#1457](https://github.com/bucketeer-io/bucketeer/issues/1457)) ([bc380eb](https://github.com/bucketeer-io/bucketeer/commit/bc380eb60dd49d857f85aebf7750447bb97dccf4))
+* change MySQL collate to utf8mb4_general_ci ([#1382](https://github.com/bucketeer-io/bucketeer/issues/1382)) ([01b31d0](https://github.com/bucketeer-io/bucketeer/commit/01b31d0f1a0e9c4483308de4dc6a7d9b445c02ff))
+* change MySQL collate to utf8mb4_general_ci ([#1385](https://github.com/bucketeer-io/bucketeer/issues/1385)) ([4874621](https://github.com/bucketeer-io/bucketeer/commit/48746218a2e01f998b9b18c158fd96c7dd507aa4))
+* change update segment cache timeout to 1 minute ([#1370](https://github.com/bucketeer-io/bucketeer/issues/1370)) ([4c87ff6](https://github.com/bucketeer-io/bucketeer/commit/4c87ff6cfc82fe0e1e7098cbf9081ce10dab1d0a))
+* create sync api key maintainer migration ([#1374](https://github.com/bucketeer-io/bucketeer/issues/1374)) ([831bbe2](https://github.com/bucketeer-io/bucketeer/commit/831bbe25ab501de364f3a8ad11416d7ba358364b))
+* implement tag name ([#1438](https://github.com/bucketeer-io/bucketeer/issues/1438)) ([62a7635](https://github.com/bucketeer-io/bucketeer/commit/62a7635eadc864ddc28434f356da748492510234))
+* remove environment_namesapce column from db ([#1444](https://github.com/bucketeer-io/bucketeer/issues/1444)) ([8026527](https://github.com/bucketeer-io/bucketeer/commit/8026527c500e31e932fe5355378d03755e881f8c))
+* remove grpc logging ([#1419](https://github.com/bucketeer-io/bucketeer/issues/1419)) ([a6fe791](https://github.com/bucketeer-io/bucketeer/commit/a6fe791b6cf7c44145442c08233690da0a1f44b9))
+* remove mau table alter sql in migration ([#1458](https://github.com/bucketeer-io/bucketeer/issues/1458)) ([c0172bf](https://github.com/bucketeer-io/bucketeer/commit/c0172bf69b827aa0cef57334ef0860dc476221eb))
+* remove old account table ([#1390](https://github.com/bucketeer-io/bucketeer/issues/1390)) ([bab9b93](https://github.com/bucketeer-io/bucketeer/commit/bab9b9357770d41c1cbfced556bd892273ab365b))
+* remove unnecessary logs ([#1415](https://github.com/bucketeer-io/bucketeer/issues/1415)) ([b4aaf97](https://github.com/bucketeer-io/bucketeer/commit/b4aaf971a0b31acf5042e5f10289eb54426b2574))
+* rename pubsub processor struct ([#1389](https://github.com/bucketeer-io/bucketeer/issues/1389)) ([f333880](https://github.com/bucketeer-io/bucketeer/commit/f333880e64ccda0d783ddddfc9d8a22dcb40bcb5))
+* **ui:** hide used tags from the tag list on the push page ([#1460](https://github.com/bucketeer-io/bucketeer/issues/1460)) ([fd26f0d](https://github.com/bucketeer-io/bucketeer/commit/fd26f0dc4b1d416d109d697f66af0ee1dc87614c))
+* **ui:** remove tag validation when updating the flag settings ([#1465](https://github.com/bucketeer-io/bucketeer/issues/1465)) ([c3c58ee](https://github.com/bucketeer-io/bucketeer/commit/c3c58ee8c2317e505b4eb85ae87509f472eba967))
+* update copyright 2025 ([#1407](https://github.com/bucketeer-io/bucketeer/issues/1407)) ([595b906](https://github.com/bucketeer-io/bucketeer/commit/595b90695196d0f3778e29cfb649fc517776ca66))
+
+
+### Performance Improvements
+
+* change to save user and event counts in one request ([#1369](https://github.com/bucketeer-io/bucketeer/issues/1369)) ([a576212](https://github.com/bucketeer-io/bucketeer/commit/a576212fe58eb045241bf89cc448bda7077e1e10))
+* improve feature caching process ([#1399](https://github.com/bucketeer-io/bucketeer/issues/1399)) ([0709bbe](https://github.com/bucketeer-io/bucketeer/commit/0709bbe422d881b3fa1f684322ee0800f154efb4))
+* improve get environment api key latency ([#1380](https://github.com/bucketeer-io/bucketeer/issues/1380)) ([d9d5895](https://github.com/bucketeer-io/bucketeer/commit/d9d589587cd6133389311b40b4a99e0dea6d1b4b))
+* improve redis pfmerge when using redis cluster ([#1372](https://github.com/bucketeer-io/bucketeer/issues/1372)) ([ac36f93](https://github.com/bucketeer-io/bucketeer/commit/ac36f937a897b521e2bd2da2dfcf361753e9198f))
+* update cache across goroutines to speed up caching ([#1398](https://github.com/bucketeer-io/bucketeer/issues/1398)) ([0905244](https://github.com/bucketeer-io/bucketeer/commit/09052449c319bf7d7affc92bbc6740d9f4eda223))
+
+
+### Reverts
+
+* change MySQL collate to utf8mb4_general_ci ([#1383](https://github.com/bucketeer-io/bucketeer/issues/1383)) ([9788305](https://github.com/bucketeer-io/bucketeer/commit/97883050020332bf6af083ce31f949e1c02e2e0f))
+* change to save user and event counts in one request ([#1371](https://github.com/bucketeer-io/bucketeer/issues/1371)) ([2a84762](https://github.com/bucketeer-io/bucketeer/commit/2a847621cfe2ffdcc0bb346ebb0b6b7381293f72))
+
+
+### Build System
+
+* **deps:** bump golang.org/x/crypto from 0.26.0 to 0.31.0 ([#1431](https://github.com/bucketeer-io/bucketeer/issues/1431)) ([b6472fc](https://github.com/bucketeer-io/bucketeer/commit/b6472fc2d65448d639398047a31ff9dc4d8ef7c1))
+* **deps:** bump golang.org/x/crypto in /hack/delete-e2e-data-mysql ([#1432](https://github.com/bucketeer-io/bucketeer/issues/1432)) ([c13ab51](https://github.com/bucketeer-io/bucketeer/commit/c13ab51b5554582eb2b2c10f193f7c8e6426ff54))
+* **deps:** bump golang.org/x/net from 0.28.0 to 0.33.0 ([#1434](https://github.com/bucketeer-io/bucketeer/issues/1434)) ([aa13996](https://github.com/bucketeer-io/bucketeer/commit/aa1399622fba167d233da6dd48fd4fef898cbf6d))
+* fix embed.go not found ([#1439](https://github.com/bucketeer-io/bucketeer/issues/1439)) ([c6ec057](https://github.com/bucketeer-io/bucketeer/commit/c6ec057afb39ffd4fcaf2e3fa554fb94bd7bc488))
+* fix proto-all rule not working on local machine ([#1429](https://github.com/bucketeer-io/bucketeer/issues/1429)) ([a89f506](https://github.com/bucketeer-io/bucketeer/commit/a89f50643e8fd1c68feeac53d8f3b8ca2cdb24f2))
+* fix ui/dashboard deleting necessary file ([#1446](https://github.com/bucketeer-io/bucketeer/issues/1446)) ([71a2fa3](https://github.com/bucketeer-io/bucketeer/commit/71a2fa3311eb3e315be87788c0315abde81244da))
+
## [1.1.0](https://github.com/bucketeer-io/bucketeer/compare/v1.0.0...v1.1.0) (2024-12-02)
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 419394634d..e693aa751a 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -80,7 +80,7 @@ SERVICE_TOKEN_PATH=/workspaces/bucketeer/tools/dev/cert/service-token \
API_KEY_NAME="e2e-test-$(date +%s)-client" \
API_KEY_PATH=/workspaces/bucketeer/tools/dev/cert/api_key_client \
API_KEY_ROLE=SDK_CLIENT \
-ENVIRONMENT_NAMESPACE=e2e \
+ENVIRONMENT_ID=e2e \
make create-api-key
```
@@ -91,7 +91,7 @@ SERVICE_TOKEN_PATH=/workspaces/bucketeer/tools/dev/cert/service-token \
API_KEY_NAME="e2e-test-$(date +%s)-server" \
API_KEY_PATH=/workspaces/bucketeer/tools/dev/cert/api_key_server \
API_KEY_ROLE=SDK_SERVER \
-ENVIRONMENT_NAMESPACE=e2e \
+ENVIRONMENT_ID=e2e \
make create-api-key
```
@@ -105,7 +105,7 @@ GATEWAY_CERT_PATH=/workspaces/bucketeer/tools/dev/cert/tls.crt \
SERVICE_TOKEN_PATH=/workspaces/bucketeer/tools/dev/cert/service-token \
API_KEY_PATH=/workspaces/bucketeer/tools/dev/cert/api_key_client \
API_KEY_SERVER_PATH=/workspaces/bucketeer/tools/dev/cert/api_key_server \
-ENVIRONMENT_NAMESPACE=e2e \
+ENVIRONMENT_ID=e2e \
ORGANIZATION_ID=default \
make e2e
```
diff --git a/Makefile b/Makefile
index c5e57c42fa..3c9e7c667a 100644
--- a/Makefile
+++ b/Makefile
@@ -235,7 +235,7 @@ create-api-key:
--name=${API_KEY_NAME} \
--role=${API_KEY_ROLE} \
--output=${API_KEY_PATH} \
- --environment-namespace=${ENVIRONMENT_NAMESPACE} \
+ --environment-id=${ENVIRONMENT_ID} \
--no-profile \
--no-gcp-trace-enabled
@@ -250,7 +250,7 @@ e2e-l4:
-gateway-port=9000 \
-gateway-cert=${GATEWAY_CERT_PATH} \
-service-token=${SERVICE_TOKEN_PATH} \
- -environment-namespace=${ENVIRONMENT_NAMESPACE} \
+ -environment-id=${ENVIRONMENT_ID} \
-test-id=${TEST_ID}
.PHONY: e2e
@@ -265,7 +265,7 @@ e2e:
-gateway-port=443 \
-gateway-cert=${GATEWAY_CERT_PATH} \
-service-token=${SERVICE_TOKEN_PATH} \
- -environment-namespace=${ENVIRONMENT_NAMESPACE} \
+ -environment-id=${ENVIRONMENT_ID} \
-organization-id=${ORGANIZATION_ID} \
-test-id=${TEST_ID}
diff --git a/api-description/apidocs.swagger.yaml b/api-description/apidocs.swagger.yaml
index 9665faa7fa..50e00796c1 100644
--- a/api-description/apidocs.swagger.yaml
+++ b/api-description/apidocs.swagger.yaml
@@ -789,6 +789,304 @@ paths:
type: string
tags:
- Account
+ /v1/code_references:
+ get:
+ summary: List
+ description: List code references. To call this API, you need a `READ` API Key role.
+ operationId: api.gateway.v1.code_references.list
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/bucketeergatewayListCodeReferencesResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - CREATED_AT
+ - UPDATED_AT
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: searchKeyword
+ in: query
+ required: false
+ type: string
+ - name: featureId
+ in: query
+ required: false
+ type: string
+ - name: authorization
+ description: The API Key generated on the Admin Console.
+ in: header
+ required: true
+ type: string
+ tags:
+ - Code References
+ post:
+ summary: Create
+ description: Create a new code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.
+ operationId: api.gateway.v1.code_references.create
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/bucketeergatewayCreateCodeReferenceResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/bucketeergatewayCreateCodeReferenceRequest'
+ - name: authorization
+ description: The API Key generated on the Admin Console.
+ in: header
+ required: true
+ type: string
+ tags:
+ - Code References
+ /v1/code_references/{id}:
+ get:
+ summary: Get
+ description: Get a code reference. To call this API, you need a `READ` API Key role.
+ operationId: api.gateway.v1.code_references.get
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/bucketeergatewayGetCodeReferenceResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: id
+ in: path
+ required: true
+ type: string
+ - name: authorization
+ description: The API Key generated on the Admin Console.
+ in: header
+ required: true
+ type: string
+ tags:
+ - Code References
+ delete:
+ summary: Delete
+ description: Delete a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.
+ operationId: api.gateway.v1.code_references.delete
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/bucketeergatewayDeleteCodeReferenceResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: id
+ in: path
+ required: true
+ type: string
+ - name: authorization
+ description: The API Key generated on the Admin Console.
+ in: header
+ required: true
+ type: string
+ tags:
+ - Code References
+ patch:
+ summary: Update
+ description: Update a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.
+ operationId: api.gateway.v1.code_references.update
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/bucketeergatewayUpdateCodeReferenceResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: id
+ in: path
+ required: true
+ type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/GatewayUpdateCodeReferenceBody'
+ - name: authorization
+ description: The API Key generated on the Admin Console.
+ in: header
+ required: true
+ type: string
+ tags:
+ - Code References
/v1/features:
get:
summary: List
@@ -1303,6 +1601,15 @@ definitions:
- PARTIALLY_MATCH
default: EQUALS
description: ' - FEATURE_FLAG: Attribute is feature ID, and value is variation ID.'
+ CodeReferenceRepositoryType:
+ type: string
+ enum:
+ - REPOSITORY_TYPE_UNSPECIFIED
+ - GITHUB
+ - GITLAB
+ - BITBUCKET
+ - CUSTOM
+ default: REPOSITORY_TYPE_UNSPECIFIED
FeatureVariationType:
type: string
enum:
@@ -1344,6 +1651,26 @@ definitions:
type: boolean
description: if true, the account will be deleted and other fields will be ignored.
title: deleted
+ GatewayUpdateCodeReferenceBody:
+ type: object
+ properties:
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
GatewayUpdateFeatureBody:
type: object
properties:
@@ -1666,6 +1993,41 @@ definitions:
properties:
account:
$ref: '#/definitions/accountAccountV2'
+ bucketeergatewayCreateCodeReferenceRequest:
+ type: object
+ properties:
+ featureId:
+ type: string
+ environmentId:
+ type: string
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryName:
+ type: string
+ repositoryOwner:
+ type: string
+ repositoryType:
+ $ref: '#/definitions/CodeReferenceRepositoryType'
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
+ bucketeergatewayCreateCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
bucketeergatewayCreateFeatureRequest:
type: object
properties:
@@ -1714,6 +2076,8 @@ definitions:
properties:
push:
$ref: '#/definitions/pushPush'
+ bucketeergatewayDeleteCodeReferenceResponse:
+ type: object
bucketeergatewayGetAccountV2ByEnvironmentIDResponse:
type: object
properties:
@@ -1724,6 +2088,11 @@ definitions:
properties:
account:
$ref: '#/definitions/accountAccountV2'
+ bucketeergatewayGetCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
bucketeergatewayGetFeatureResponse:
type: object
properties:
@@ -1752,6 +2121,19 @@ definitions:
totalCount:
type: string
format: int64
+ bucketeergatewayListCodeReferencesResponse:
+ type: object
+ properties:
+ codeReferences:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/coderefCodeReference'
+ cursor:
+ type: string
+ totalCount:
+ type: string
+ format: int64
bucketeergatewayListFeaturesResponse:
type: object
properties:
@@ -1778,6 +2160,11 @@ definitions:
properties:
account:
$ref: '#/definitions/accountAccountV2'
+ bucketeergatewayUpdateCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
bucketeergatewayUpdateFeatureResponse:
type: object
properties:
@@ -1809,6 +2196,60 @@ definitions:
- NODE_SERVER
- JAVASCRIPT
default: UNKNOWN
+ coderefCodeReference:
+ type: object
+ properties:
+ id:
+ type: string
+ featureId:
+ type: string
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryName:
+ type: string
+ repositoryOwner:
+ type: string
+ repositoryType:
+ $ref: '#/definitions/CodeReferenceRepositoryType'
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
+ environmentId:
+ type: string
+ createdAt:
+ type: string
+ format: int64
+ updatedAt:
+ type: string
+ format: int64
+ sourceUrl:
+ type: string
+ title: URL to view the code in the repository
+ coderefListCodeReferencesRequestOrderBy:
+ type: string
+ enum:
+ - DEFAULT
+ - CREATED_AT
+ - UPDATED_AT
+ default: DEFAULT
+ coderefListCodeReferencesRequestOrderDirection:
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
environmentEnvironmentV2:
type: object
properties:
diff --git a/api-description/web-api.swagger.yaml b/api-description/web-api.swagger.yaml
index d7f42f5843..a853d54c91 100644
--- a/api-description/web-api.swagger.yaml
+++ b/api-description/web-api.swagger.yaml
@@ -1488,16 +1488,16 @@ paths:
$ref: '#/definitions/authSignInRequest'
tags:
- Authentication
- /v1/environment/archive_environment:
- post:
- summary: Archive
- description: Archive an environment. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.archive_environment
+ /v1/code_references:
+ get:
+ summary: List
+ description: List code references with optional filtering.
+ operationId: web.v1.code_reference.list
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentArchiveEnvironmentV2Response'
+ $ref: '#/definitions/coderefListCodeReferencesResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1516,15 +1516,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -1539,23 +1530,79 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
- required: true
- schema:
- $ref: '#/definitions/environmentArchiveEnvironmentV2Request'
+ - name: environmentId
+ in: query
+ required: false
+ type: string
+ - name: featureId
+ in: query
+ required: false
+ type: string
+ - name: repositoryName
+ in: query
+ required: false
+ type: string
+ - name: repositoryOwner
+ in: query
+ required: false
+ type: string
+ - name: repositoryType
+ in: query
+ required: false
+ type: string
+ enum:
+ - REPOSITORY_TYPE_UNSPECIFIED
+ - GITHUB
+ - GITLAB
+ - BITBUCKET
+ - CUSTOM
+ default: REPOSITORY_TYPE_UNSPECIFIED
+ - name: repositoryBranch
+ in: query
+ required: false
+ type: string
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - CREATED_AT
+ - UPDATED_AT
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: fileExtension
+ description: File extension to filter code references (e.g., ".js", ".go", ".py")
+ in: query
+ required: false
+ type: string
tags:
- - Environment
- /v1/environment/archive_organization:
+ - Code Reference
post:
- summary: Archive
- description: Archive an organization. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.archive_organization
+ summary: Create
+ description: Create a new code reference. To call this API, you need a `WRITE` role.
+ operationId: web.v1.code_reference.create
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentArchiveOrganizationResponse'
+ $ref: '#/definitions/coderefCreateCodeReferenceResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1601,19 +1648,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentArchiveOrganizationRequest'
+ $ref: '#/definitions/coderefCreateCodeReferenceRequest'
tags:
- - Organization
- /v1/environment/convert_trial_organization:
- post:
- summary: Convert Trial
- description: Convert a trial organization to a paid one. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.convert_trial_organization
+ - Code Reference
+ /v1/code_references/{id}:
+ get:
+ summary: Get
+ description: Get a code reference by ID.
+ operationId: web.v1.code_reference.get
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentConvertTrialOrganizationResponse'
+ $ref: '#/definitions/coderefGetCodeReferenceResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1655,23 +1702,25 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
+ - name: id
+ in: path
required: true
- schema:
- $ref: '#/definitions/environmentConvertTrialOrganizationRequest'
+ type: string
+ - name: environmentId
+ in: query
+ required: false
+ type: string
tags:
- - Organization
- /v1/environment/convert_trial_project:
- post:
- summary: Convert Trial
- description: Convert a trial project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.convert_trial_project
+ - Code Reference
+ delete:
+ summary: Delete
+ description: Delete a code reference. To call this API, you need a `WRITE` role.
+ operationId: web.v1.code_reference.delete
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentConvertTrialProjectResponse'
+ $ref: '#/definitions/coderefDeleteCodeReferenceResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1713,23 +1762,25 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
+ - name: id
+ in: path
required: true
- schema:
- $ref: '#/definitions/environmentConvertTrialProjectRequest'
+ type: string
+ - name: environmentId
+ in: query
+ required: false
+ type: string
tags:
- - Project
- /v1/environment/create_environment:
- post:
- summary: Create
- description: Create an environment. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.create_environment
+ - Code Reference
+ patch:
+ summary: Update
+ description: Update an existing code reference. To call this API, you need a `WRITE` role.
+ operationId: web.v1.code_reference.update
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentCreateEnvironmentV2Response'
+ $ref: '#/definitions/coderefUpdateCodeReferenceResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1771,23 +1822,27 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
+ - name: id
+ in: path
+ required: true
+ type: string
- name: body
in: body
required: true
schema:
- $ref: '#/definitions/environmentCreateEnvironmentV2Request'
+ $ref: '#/definitions/CodeReferenceServiceUpdateCodeReferenceBody'
tags:
- - Environment
- /v1/environment/create_organization:
+ - Code Reference
+ /v1/environment/archive_environment:
post:
- summary: Create
- description: Create an organization. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.create_organization
+ summary: Archive
+ description: Archive an environment. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.archive_environment
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentCreateOrganizationResponse'
+ $ref: '#/definitions/environmentArchiveEnvironmentV2Response'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1833,19 +1888,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentCreateOrganizationRequest'
+ $ref: '#/definitions/environmentArchiveEnvironmentV2Request'
tags:
- - Organization
- /v1/environment/create_project:
+ - Environment
+ /v1/environment/archive_organization:
post:
- summary: Create
- description: Create a project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.create_project
+ summary: Archive
+ description: Archive an organization. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.archive_organization
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentCreateProjectResponse'
+ $ref: '#/definitions/environmentArchiveOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1891,19 +1946,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentCreateProjectRequest'
+ $ref: '#/definitions/environmentArchiveOrganizationRequest'
tags:
- - Project
- /v1/environment/create_trial_project:
+ - Organization
+ /v1/environment/convert_trial_organization:
post:
- summary: Create Trial
- description: Create a trial project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.create_trial_project
+ summary: Convert Trial
+ description: Convert a trial organization to a paid one. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.convert_trial_organization
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentCreateTrialProjectResponse'
+ $ref: '#/definitions/environmentConvertTrialOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -1949,19 +2004,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentCreateTrialProjectRequest'
+ $ref: '#/definitions/environmentConvertTrialOrganizationRequest'
tags:
- - Project
- /v1/environment/disable_organization:
+ - Organization
+ /v1/environment/convert_trial_project:
post:
- summary: Disable
- description: Disable an organization. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.disable_organization
+ summary: Convert Trial
+ description: Convert a trial project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.convert_trial_project
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentDisableOrganizationResponse'
+ $ref: '#/definitions/environmentConvertTrialProjectResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2007,19 +2062,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentDisableOrganizationRequest'
+ $ref: '#/definitions/environmentConvertTrialProjectRequest'
tags:
- - Organization
- /v1/environment/disable_project:
+ - Project
+ /v1/environment/create_environment:
post:
- summary: Disable
- description: Disable a project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.disable_project
+ summary: Create
+ description: Create an environment. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.create_environment
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentDisableProjectResponse'
+ $ref: '#/definitions/environmentCreateEnvironmentV2Response'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2065,19 +2120,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentDisableProjectRequest'
+ $ref: '#/definitions/environmentCreateEnvironmentV2Request'
tags:
- - Project
- /v1/environment/enable_organization:
+ - Environment
+ /v1/environment/create_organization:
post:
- summary: Enable
- description: Enable an organization. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.enable_organization
+ summary: Create
+ description: Create an organization. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.create_organization
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentEnableOrganizationResponse'
+ $ref: '#/definitions/environmentCreateOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2123,19 +2178,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentEnableOrganizationRequest'
+ $ref: '#/definitions/environmentCreateOrganizationRequest'
tags:
- Organization
- /v1/environment/enable_project:
+ /v1/environment/create_project:
post:
- summary: Enable
- description: Enable a project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.enable_project
+ summary: Create
+ description: Create a project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.create_project
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentEnableProjectResponse'
+ $ref: '#/definitions/environmentCreateProjectResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2181,19 +2236,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentEnableProjectRequest'
+ $ref: '#/definitions/environmentCreateProjectRequest'
tags:
- Project
- /v1/environment/get_environment:
- get:
- summary: Get
- description: Get an environment. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.get_environment
+ /v1/environment/create_trial_project:
+ post:
+ summary: Create Trial
+ description: Create a trial project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.create_trial_project
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentGetEnvironmentV2Response'
+ $ref: '#/definitions/environmentCreateTrialProjectResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2235,22 +2290,23 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: id
- in: query
- required: false
- type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentCreateTrialProjectRequest'
tags:
- - Environment
- /v1/environment/get_organization:
- get:
- summary: Get
- description: Get an organization. To call this API, you need at least a MEMBER role.
- operationId: web.v1.environment.get_organization
- responses:
+ - Project
+ /v1/environment/disable_organization:
+ post:
+ summary: Disable
+ description: Disable an organization. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.disable_organization
+ responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentGetOrganizationResponse'
+ $ref: '#/definitions/environmentDisableOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2292,22 +2348,23 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: id
- in: query
- required: false
- type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentDisableOrganizationRequest'
tags:
- Organization
- /v1/environment/get_project:
- get:
- summary: Get
- description: Get a project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.get_project
+ /v1/environment/disable_project:
+ post:
+ summary: Disable
+ description: Disable a project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.disable_project
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentGetProjectResponse'
+ $ref: '#/definitions/environmentDisableProjectResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2349,26 +2406,23 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: id
- in: query
- required: false
- type: string
- - name: organizationId
- in: query
- required: false
- type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentDisableProjectRequest'
tags:
- Project
- /v1/environment/list_environments:
- get:
- summary: List
- description: List environments. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.list_environments
+ /v1/environment/enable_organization:
+ post:
+ summary: Enable
+ description: Enable an organization. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.enable_organization
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentListEnvironmentsV2Response'
+ $ref: '#/definitions/environmentEnableOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2410,64 +2464,23 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: pageSize
- in: query
- required: false
- type: string
- format: int64
- - name: cursor
- in: query
- required: false
- type: string
- - name: orderBy
- in: query
- required: false
- type: string
- enum:
- - DEFAULT
- - ID
- - NAME
- - URL_CODE
- - CREATED_AT
- - UPDATED_AT
- - FEATURE_COUNT
- default: DEFAULT
- - name: orderDirection
- in: query
- required: false
- type: string
- enum:
- - ASC
- - DESC
- default: ASC
- - name: projectId
- in: query
- required: false
- type: string
- - name: archived
- in: query
- required: false
- type: boolean
- - name: searchKeyword
- in: query
- required: false
- type: string
- - name: organizationId
- in: query
- required: false
- type: string
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentEnableOrganizationRequest'
tags:
- - Environment
- /v1/environment/list_organizations:
- get:
- summary: List
- description: List organizations. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.list_organizations
+ - Organization
+ /v1/environment/enable_project:
+ post:
+ summary: Enable
+ description: Enable a project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.enable_project
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentListOrganizationsResponse'
+ $ref: '#/definitions/environmentEnableProjectResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2509,62 +2522,23 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: pageSize
- in: query
- required: false
- type: string
- format: int64
- - name: cursor
- in: query
- required: false
- type: string
- - name: orderBy
- in: query
- required: false
- type: string
- enum:
- - DEFAULT
- - ID
- - CREATED_AT
- - UPDATED_AT
- - NAME
- - URL_CODE
- - PROJECT_COUNT
- - ENVIRONMENT_COUNT
- - USER_COUNT
- default: DEFAULT
- - name: orderDirection
- in: query
- required: false
- type: string
- enum:
- - ASC
- - DESC
- default: ASC
- - name: searchKeyword
- in: query
- required: false
- type: string
- - name: disabled
- in: query
- required: false
- type: boolean
- - name: archived
- in: query
- required: false
- type: boolean
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentEnableProjectRequest'
tags:
- - Organization
- /v1/environment/list_projects:
+ - Project
+ /v1/environment/get_environment:
get:
- summary: List
- description: List projects. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.list_projects
+ summary: Get
+ description: Get an environment. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.get_environment
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentListProjectsResponse'
+ $ref: '#/definitions/environmentGetEnvironmentV2Response'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2606,65 +2580,22 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: pageSize
- in: query
- required: false
- type: string
- format: int64
- - name: cursor
- in: query
- required: false
- type: string
- - name: orderBy
- in: query
- required: false
- type: string
- enum:
- - DEFAULT
- - ID
- - CREATED_AT
- - UPDATED_AT
- - NAME
- - URL_CODE
- - ENVIRONMENT_COUNT
- - FEATURE_COUNT
- - CREATOR_EMAIL
- default: DEFAULT
- - name: orderDirection
- in: query
- required: false
- type: string
- enum:
- - ASC
- - DESC
- default: ASC
- - name: searchKeyword
+ - name: id
in: query
required: false
type: string
- - name: disabled
- in: query
- required: false
- type: boolean
- - name: organizationIds
- in: query
- required: false
- type: array
- items:
- type: string
- collectionFormat: multi
tags:
- - Project
- /v1/environment/list_projects_v2:
+ - Environment
+ /v1/environment/get_organization:
get:
- summary: List Projects V2
- description: List projects with V2 API. To call this API, you need at least a MEMBER role in the specified organizations.
- operationId: web.v1.environment.list_projects_v2
+ summary: Get
+ description: Get an organization. To call this API, you need at least a MEMBER role.
+ operationId: web.v1.environment.get_organization
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentListProjectsV2Response'
+ $ref: '#/definitions/environmentGetOrganizationResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2706,29 +2637,145 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: pageSize
- in: query
- required: false
- type: string
- format: int64
- - name: cursor
- in: query
- required: false
- type: string
- - name: orderBy
+ - name: id
in: query
required: false
type: string
- enum:
- - DEFAULT
- - ID
- - CREATED_AT
- - UPDATED_AT
- - NAME
- - URL_CODE
- - ENVIRONMENT_COUNT
+ tags:
+ - Organization
+ /v1/environment/get_project:
+ get:
+ summary: Get
+ description: Get a project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.get_project
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentGetProjectResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: id
+ in: query
+ required: false
+ type: string
+ - name: organizationId
+ in: query
+ required: false
+ type: string
+ tags:
+ - Project
+ /v1/environment/list_environments:
+ get:
+ summary: List
+ description: List environments. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.list_environments
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentListEnvironmentsV2Response'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - ID
+ - NAME
+ - URL_CODE
+ - CREATED_AT
+ - UPDATED_AT
- FEATURE_COUNT
- - CREATOR_EMAIL
default: DEFAULT
- name: orderDirection
in: query
@@ -2738,37 +2785,625 @@ paths:
- ASC
- DESC
default: ASC
- - name: searchKeyword
+ - name: projectId
in: query
required: false
type: string
- - name: disabled
+ - name: archived
in: query
required: false
type: boolean
- - name: organizationIds
+ - name: searchKeyword
in: query
required: false
- type: array
- items:
- type: string
- collectionFormat: multi
+ type: string
- name: organizationId
in: query
required: false
type: string
tags:
- - Project
- /v1/environment/unarchive_environment:
- post:
- summary: Unarchive
- description: Unarchive an environment. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.unarchive_environment
+ - Environment
+ /v1/environment/list_organizations:
+ get:
+ summary: List
+ description: List organizations. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.list_organizations
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentListOrganizationsResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - ID
+ - CREATED_AT
+ - UPDATED_AT
+ - NAME
+ - URL_CODE
+ - PROJECT_COUNT
+ - ENVIRONMENT_COUNT
+ - USER_COUNT
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: searchKeyword
+ in: query
+ required: false
+ type: string
+ - name: disabled
+ in: query
+ required: false
+ type: boolean
+ - name: archived
+ in: query
+ required: false
+ type: boolean
+ tags:
+ - Organization
+ /v1/environment/list_projects:
+ get:
+ summary: List
+ description: List projects. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.list_projects
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentListProjectsResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - ID
+ - CREATED_AT
+ - UPDATED_AT
+ - NAME
+ - URL_CODE
+ - ENVIRONMENT_COUNT
+ - FEATURE_COUNT
+ - CREATOR_EMAIL
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: searchKeyword
+ in: query
+ required: false
+ type: string
+ - name: disabled
+ in: query
+ required: false
+ type: boolean
+ - name: organizationIds
+ in: query
+ required: false
+ type: array
+ items:
+ type: string
+ collectionFormat: multi
+ tags:
+ - Project
+ /v1/environment/list_projects_v2:
+ get:
+ summary: List Projects V2
+ description: List projects with V2 API. To call this API, you need at least a MEMBER role in the specified organizations.
+ operationId: web.v1.environment.list_projects_v2
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentListProjectsV2Response'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - ID
+ - CREATED_AT
+ - UPDATED_AT
+ - NAME
+ - URL_CODE
+ - ENVIRONMENT_COUNT
+ - FEATURE_COUNT
+ - CREATOR_EMAIL
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: searchKeyword
+ in: query
+ required: false
+ type: string
+ - name: disabled
+ in: query
+ required: false
+ type: boolean
+ - name: organizationIds
+ in: query
+ required: false
+ type: array
+ items:
+ type: string
+ collectionFormat: multi
+ - name: organizationId
+ in: query
+ required: false
+ type: string
+ tags:
+ - Project
+ /v1/environment/unarchive_environment:
+ post:
+ summary: Unarchive
+ description: Unarchive an environment. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.unarchive_environment
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentUnarchiveEnvironmentV2Response'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentUnarchiveEnvironmentV2Request'
+ tags:
+ - Environment
+ /v1/environment/unarchive_organization:
+ post:
+ summary: Unarchive
+ description: Unarchive an organization. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.unarchive_organization
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentUnarchiveOrganizationResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentUnarchiveOrganizationRequest'
+ tags:
+ - Organization
+ /v1/environment/update_environment:
+ post:
+ summary: Update
+ description: Update an environment. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.update_environment
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentUpdateEnvironmentV2Response'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentUpdateEnvironmentV2Request'
+ tags:
+ - Environment
+ /v1/environment/update_organization:
+ post:
+ summary: Update
+ description: Update an organization. To call this API, you need an `ADMIN` role.
+ operationId: web.v1.environment.update_organization
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentUpdateOrganizationResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentUpdateOrganizationRequest'
+ tags:
+ - Organization
+ /v1/environment/update_project:
+ post:
+ summary: Update
+ description: Update a project. To call this API, you need an `SYSTEM_ADMIN` role.
+ operationId: web.v1.environment.update_project
+ responses:
+ "200":
+ description: A successful response.
+ schema:
+ $ref: '#/definitions/environmentUpdateProjectResponse'
+ "400":
+ description: Returned for bad requests that may have failed validation.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 3
+ details: []
+ message: invalid arguments error
+ "401":
+ description: Request could not be authenticated (authentication required).
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 16
+ details: []
+ message: not authenticated
+ "403":
+ description: Request does not have permission to access the resource.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 7
+ details: []
+ message: not authorized
+ "503":
+ description: Returned for internal errors.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ examples:
+ application/json:
+ code: 13
+ details: []
+ message: internal
+ default:
+ description: An unexpected error response.
+ schema:
+ $ref: '#/definitions/googlerpcStatus'
+ parameters:
+ - name: body
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/environmentUpdateProjectRequest'
+ tags:
+ - Project
+ /v1/experiment:
+ get:
+ summary: Get
+ description: Get an experiment.
+ operationId: web.v1.experiment.get
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentUnarchiveEnvironmentV2Response'
+ $ref: '#/definitions/experimentGetExperimentResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2787,15 +3422,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -2810,23 +3436,25 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
- required: true
- schema:
- $ref: '#/definitions/environmentUnarchiveEnvironmentV2Request'
+ - name: id
+ in: query
+ required: false
+ type: string
+ - name: environmentId
+ in: query
+ required: false
+ type: string
tags:
- - Environment
- /v1/environment/unarchive_organization:
+ - experiment
post:
- summary: Unarchive
- description: Unarchive an organization. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.unarchive_organization
+ summary: Create
+ description: Create an experiment.
+ operationId: web.v1.experiment.create
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentUnarchiveOrganizationResponse'
+ $ref: '#/definitions/experimentCreateExperimentResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2845,15 +3473,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -2872,19 +3491,19 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/environmentUnarchiveOrganizationRequest'
+ $ref: '#/definitions/experimentCreateExperimentRequest'
tags:
- - Organization
- /v1/environment/update_environment:
- post:
- summary: Update
- description: Update an environment. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.update_environment
+ - experiment
+ /v1/experiments:
+ get:
+ summary: List
+ description: List experiments.
+ operationId: web.v1.experiment.list
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentUpdateEnvironmentV2Response'
+ $ref: '#/definitions/experimentListExperimentsResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2903,15 +3522,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -2926,23 +3536,98 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
+ - name: featureId
+ in: query
+ required: false
+ type: string
+ - name: featureVersion
+ in: query
+ required: false
+ type: integer
+ format: int32
+ - name: from
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: to
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: pageSize
+ in: query
+ required: false
+ type: string
+ format: int64
+ - name: cursor
+ in: query
+ required: false
+ type: string
+ - name: status
+ description: '[deprecated = true];'
+ in: query
+ required: false
+ type: integer
+ format: int32
+ - name: maintainer
+ in: query
+ required: false
+ type: string
+ - name: orderBy
+ in: query
+ required: false
+ type: string
+ enum:
+ - DEFAULT
+ - NAME
+ - CREATED_AT
+ - UPDATED_AT
+ default: DEFAULT
+ - name: orderDirection
+ in: query
+ required: false
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ - name: searchKeyword
+ in: query
+ required: false
+ type: string
+ - name: archived
+ in: query
+ required: false
+ type: boolean
+ - name: statuses
+ in: query
+ required: false
+ type: array
+ items:
+ type: string
+ enum:
+ - WAITING
+ - RUNNING
+ - STOPPED
+ - FORCE_STOPPED
+ collectionFormat: multi
+ - name: environmentId
+ in: query
required: true
- schema:
- $ref: '#/definitions/environmentUpdateEnvironmentV2Request'
+ type: string
tags:
- - Environment
- /v1/environment/update_organization:
- post:
- summary: Update
- description: Update an organization. To call this API, you need an `ADMIN` role.
- operationId: web.v1.environment.update_organization
+ - experiment
+ /v1/goal:
+ get:
+ summary: Get
+ description: Get a goal.
+ operationId: web.v1.goal.get
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentUpdateOrganizationResponse'
+ $ref: '#/definitions/experimentGetGoalResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -2961,15 +3646,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -2984,23 +3660,25 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
+ - name: id
+ in: query
required: true
- schema:
- $ref: '#/definitions/environmentUpdateOrganizationRequest'
+ type: string
+ - name: environmentId
+ in: query
+ required: true
+ type: string
tags:
- - Organization
- /v1/environment/update_project:
- post:
- summary: Update
- description: Update a project. To call this API, you need an `SYSTEM_ADMIN` role.
- operationId: web.v1.environment.update_project
+ - goal
+ delete:
+ summary: Delete
+ description: Delete a goal.
+ operationId: web.v1.goal.delete
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/environmentUpdateProjectResponse'
+ $ref: '#/definitions/experimentDeleteGoalResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -3019,15 +3697,6 @@ paths:
code: 16
details: []
message: not authenticated
- "403":
- description: Request does not have permission to access the resource.
- schema:
- $ref: '#/definitions/googlerpcStatus'
- examples:
- application/json:
- code: 7
- details: []
- message: not authorized
"503":
description: Returned for internal errors.
schema:
@@ -3042,23 +3711,25 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: body
- in: body
+ - name: id
+ in: query
required: true
- schema:
- $ref: '#/definitions/environmentUpdateProjectRequest'
+ type: string
+ - name: environmentId
+ in: query
+ required: true
+ type: string
tags:
- - Project
- /v1/goal:
- get:
- summary: Get
- description: Get a goal.
- operationId: web.v1.goal.get
+ - goal
+ post:
+ summary: Create
+ description: Create a goal.
+ operationId: web.v1.goal.create
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/experimentGetGoalResponse'
+ $ref: '#/definitions/experimentCreateGoalResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -3091,25 +3762,22 @@ paths:
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- - name: id
- in: query
- required: true
- type: string
- - name: environmentId
- in: query
+ - name: body
+ in: body
required: true
- type: string
+ schema:
+ $ref: '#/definitions/experimentCreateGoalRequest'
tags:
- goal
- post:
- summary: Create
- description: Create a goal.
- operationId: web.v1.goal.create
+ patch:
+ summary: Update
+ description: Update a goal.
+ operationId: web.v1.goal.update
responses:
"200":
description: A successful response.
schema:
- $ref: '#/definitions/experimentCreateGoalResponse'
+ $ref: '#/definitions/experimentUpdateGoalResponse'
"400":
description: Returned for bad requests that may have failed validation.
schema:
@@ -3146,7 +3814,7 @@ paths:
in: body
required: true
schema:
- $ref: '#/definitions/experimentCreateGoalRequest'
+ $ref: '#/definitions/experimentUpdateGoalRequest'
tags:
- goal
/v1/goals:
@@ -3209,6 +3877,7 @@ paths:
- NAME
- CREATED_AT
- UPDATED_AT
+ - CONNECTION_TYPE
default: DEFAULT
- name: orderDirection
in: query
@@ -4095,6 +4764,7 @@ paths:
- DOMAIN_EVENT_ORGANIZATION
- DOMAIN_EVENT_FLAG_TRIGGER
- DOMAIN_EVENT_TAG
+ - DOMAIN_EVENT_CODEREF
- FEATURE_STALE
- EXPERIMENT_RUNNING
- MAU_COUNT
@@ -4320,6 +4990,15 @@ paths:
in: query
required: false
type: string
+ - name: entityType
+ in: query
+ required: false
+ type: string
+ enum:
+ - UNSPECIFIED
+ - FEATURE_FLAG
+ - ACCOUNT
+ default: UNSPECIFIED
tags:
- tag
/webhook/triggers/{token}:
@@ -4354,34 +5033,60 @@ definitions:
enum:
- Organization_UNASSIGNED
- Organization_MEMBER
- - Organization_ADMIN
- - Organization_OWNER
- default: Organization_UNASSIGNED
- ChangeAccountV2EnvironmentRolesCommandWriteType:
- type: string
- enum:
- - WriteType_UNSPECIFIED
- - WriteType_OVERRIDE
- - WriteType_PATCH
- default: WriteType_UNSPECIFIED
- ClauseOperator:
- type: string
- enum:
- - EQUALS
- - IN
- - ENDS_WITH
- - STARTS_WITH
- - SEGMENT
- - GREATER
- - GREATER_OR_EQUAL
- - LESS
- - LESS_OR_EQUAL
- - BEFORE
- - AFTER
- - FEATURE_FLAG
- - PARTIALLY_MATCH
- default: EQUALS
- description: ' - FEATURE_FLAG: Attribute is feature ID, and value is variation ID.'
+ - Organization_ADMIN
+ - Organization_OWNER
+ default: Organization_UNASSIGNED
+ ChangeAccountV2EnvironmentRolesCommandWriteType:
+ type: string
+ enum:
+ - WriteType_UNSPECIFIED
+ - WriteType_OVERRIDE
+ - WriteType_PATCH
+ default: WriteType_UNSPECIFIED
+ CodeReferenceRepositoryType:
+ type: string
+ enum:
+ - REPOSITORY_TYPE_UNSPECIFIED
+ - GITHUB
+ - GITLAB
+ - BITBUCKET
+ - CUSTOM
+ default: REPOSITORY_TYPE_UNSPECIFIED
+ CodeReferenceServiceUpdateCodeReferenceBody:
+ type: object
+ properties:
+ environmentId:
+ type: string
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryName:
+ type: string
+ repositoryOwner:
+ type: string
+ repositoryType:
+ $ref: '#/definitions/CodeReferenceRepositoryType'
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
+ ExperimentGoalReference:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
FeatureVariationType:
type: string
enum:
@@ -4397,6 +5102,25 @@ definitions:
- Action_ON
- Action_OFF
default: Action_UNKNOWN
+ GoalConnectionType:
+ type: string
+ enum:
+ - UNKNOWN
+ - EXPERIMENT
+ - OPERATION
+ default: UNKNOWN
+ ListExperimentsResponseSummary:
+ type: object
+ properties:
+ totalWaitingCount:
+ type: string
+ format: int64
+ totalRunningCount:
+ type: string
+ format: int64
+ totalStoppedCount:
+ type: string
+ format: int64
ListFlagTriggersResponseFlagTriggerWithUrl:
type: object
properties:
@@ -4438,6 +5162,7 @@ definitions:
- DOMAIN_EVENT_ORGANIZATION
- DOMAIN_EVENT_FLAG_TRIGGER
- DOMAIN_EVENT_TAG
+ - DOMAIN_EVENT_CODEREF
- FEATURE_STALE
- EXPERIMENT_RUNNING
- MAU_COUNT
@@ -4445,10 +5170,10 @@ definitions:
TagEntityType:
type: string
enum:
- - UNKNOWN
+ - UNSPECIFIED
- FEATURE_FLAG
- ACCOUNT
- default: UNKNOWN
+ default: UNSPECIFIED
UpdateAccountV2RequestAccountV2Avatar:
type: object
properties:
@@ -5215,6 +5940,61 @@ definitions:
expiry:
type: string
format: int64
+ autoopsActionType:
+ type: string
+ enum:
+ - UNKNOWN
+ - ENABLE
+ - DISABLE
+ default: UNKNOWN
+ autoopsAutoOpsRule:
+ type: object
+ properties:
+ id:
+ type: string
+ featureId:
+ type: string
+ opsType:
+ $ref: '#/definitions/autoopsOpsType'
+ clauses:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/bucketeerautoopsClause'
+ createdAt:
+ type: string
+ format: int64
+ updatedAt:
+ type: string
+ format: int64
+ deleted:
+ type: boolean
+ autoOpsStatus:
+ $ref: '#/definitions/autoopsAutoOpsStatus'
+ autoopsAutoOpsStatus:
+ type: string
+ enum:
+ - WAITING
+ - RUNNING
+ - FINISHED
+ - STOPPED
+ default: WAITING
+ autoopsOpsType:
+ type: string
+ enum:
+ - TYPE_UNKNOWN
+ - SCHEDULE
+ - EVENT_RATE
+ default: TYPE_UNKNOWN
+ bucketeerautoopsClause:
+ type: object
+ properties:
+ id:
+ type: string
+ clause:
+ $ref: '#/definitions/protobufAny'
+ actionType:
+ $ref: '#/definitions/autoopsActionType'
bucketeerenvironmentOrganization:
type: object
properties:
@@ -5252,6 +6032,19 @@ definitions:
format: int32
ownerEmail:
type: string
+ bucketeerfeatureClause:
+ type: object
+ properties:
+ id:
+ type: string
+ attribute:
+ type: string
+ operator:
+ $ref: '#/definitions/featureClauseOperator'
+ values:
+ type: array
+ items:
+ type: string
bucketeerfeatureListTagsRequestOrderBy:
type: string
enum:
@@ -5352,6 +6145,120 @@ definitions:
$ref: '#/definitions/TagEntityType'
environmentId:
type: string
+ coderefCodeReference:
+ type: object
+ properties:
+ id:
+ type: string
+ featureId:
+ type: string
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryName:
+ type: string
+ repositoryOwner:
+ type: string
+ repositoryType:
+ $ref: '#/definitions/CodeReferenceRepositoryType'
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
+ environmentId:
+ type: string
+ createdAt:
+ type: string
+ format: int64
+ updatedAt:
+ type: string
+ format: int64
+ sourceUrl:
+ type: string
+ title: URL to view the code in the repository
+ coderefCreateCodeReferenceRequest:
+ type: object
+ properties:
+ featureId:
+ type: string
+ environmentId:
+ type: string
+ filePath:
+ type: string
+ lineNumber:
+ type: integer
+ format: int32
+ codeSnippet:
+ type: string
+ contentHash:
+ type: string
+ aliases:
+ type: array
+ items:
+ type: string
+ repositoryName:
+ type: string
+ repositoryOwner:
+ type: string
+ repositoryType:
+ $ref: '#/definitions/CodeReferenceRepositoryType'
+ repositoryBranch:
+ type: string
+ commitHash:
+ type: string
+ coderefCreateCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
+ coderefDeleteCodeReferenceResponse:
+ type: object
+ coderefGetCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
+ coderefListCodeReferencesRequestOrderBy:
+ type: string
+ enum:
+ - DEFAULT
+ - CREATED_AT
+ - UPDATED_AT
+ default: DEFAULT
+ coderefListCodeReferencesRequestOrderDirection:
+ type: string
+ enum:
+ - ASC
+ - DESC
+ default: ASC
+ coderefListCodeReferencesResponse:
+ type: object
+ properties:
+ codeReferences:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/coderefCodeReference'
+ cursor:
+ type: string
+ totalCount:
+ type: string
+ format: int64
+ coderefUpdateCodeReferenceResponse:
+ type: object
+ properties:
+ codeReference:
+ $ref: '#/definitions/coderefCodeReference'
environmentArchiveEnvironmentV2Command:
type: object
environmentArchiveEnvironmentV2Request:
@@ -5900,6 +6807,40 @@ definitions:
type: string
baseVariationId:
type: string
+ experimentCreateExperimentRequest:
+ type: object
+ properties:
+ command:
+ $ref: '#/definitions/experimentCreateExperimentCommand'
+ description: deprecated
+ environmentId:
+ type: string
+ featureId:
+ type: string
+ startAt:
+ type: string
+ format: int64
+ stopAt:
+ type: string
+ format: int64
+ goalIds:
+ type: array
+ items:
+ type: string
+ name:
+ type: string
+ description:
+ type: string
+ baseVariationId:
+ type: string
+ required:
+ - environmentId
+ - featureId
+ - startAt
+ - stopAt
+ - goalIds
+ - name
+ - baseVariationId
experimentCreateExperimentResponse:
type: object
properties:
@@ -5914,6 +6855,8 @@ definitions:
type: string
description:
type: string
+ connectionType:
+ $ref: '#/definitions/GoalConnectionType'
experimentCreateGoalRequest:
type: object
properties:
@@ -5928,6 +6871,8 @@ definitions:
type: string
description:
type: string
+ connectionType:
+ $ref: '#/definitions/GoalConnectionType'
required:
- environmentId
- id
@@ -5997,6 +6942,11 @@ definitions:
type: string
archived:
type: boolean
+ goals:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/ExperimentGoalReference'
experimentExperimentStatus:
type: string
enum:
@@ -6041,6 +6991,18 @@ definitions:
description: This field is set only when APIs return.
archived:
type: boolean
+ connectionType:
+ $ref: '#/definitions/GoalConnectionType'
+ experiments:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/experimentExperiment'
+ autoOpsRules:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/autoopsAutoOpsRule'
experimentListExperimentsRequestOrderBy:
type: string
enum:
@@ -6068,6 +7030,8 @@ definitions:
totalCount:
type: string
format: int64
+ summary:
+ $ref: '#/definitions/ListExperimentsResponseSummary'
experimentListGoalsRequestOrderBy:
type: string
enum:
@@ -6075,6 +7039,7 @@ definitions:
- NAME
- CREATED_AT
- UPDATED_AT
+ - CONNECTION_TYPE
default: DEFAULT
experimentListGoalsRequestOrderDirection:
type: string
@@ -6110,8 +7075,34 @@ definitions:
type: object
experimentUpdateExperimentResponse:
type: object
+ experimentUpdateGoalRequest:
+ type: object
+ properties:
+ id:
+ type: string
+ renameCommand:
+ $ref: '#/definitions/experimentRenameGoalCommand'
+ description: deprecated
+ changeDescriptionCommand:
+ $ref: '#/definitions/experimentChangeDescriptionGoalCommand'
+ description: deprecated
+ environmentId:
+ type: string
+ name:
+ type: string
+ description:
+ type: string
+ archived:
+ type: boolean
+ description: if true, the goal will be archived
+ required:
+ - id
+ - environmentId
experimentUpdateGoalResponse:
type: object
+ properties:
+ goal:
+ $ref: '#/definitions/experimentGoal'
featureAddSegmentUserCommand:
type: object
properties:
@@ -6176,19 +7167,24 @@ definitions:
properties:
description:
type: string
- featureClause:
- type: object
- properties:
- id:
- type: string
- attribute:
- type: string
- operator:
- $ref: '#/definitions/ClauseOperator'
- values:
- type: array
- items:
- type: string
+ featureClauseOperator:
+ type: string
+ enum:
+ - EQUALS
+ - IN
+ - ENDS_WITH
+ - STARTS_WITH
+ - SEGMENT
+ - GREATER
+ - GREATER_OR_EQUAL
+ - LESS
+ - LESS_OR_EQUAL
+ - BEFORE
+ - AFTER
+ - FEATURE_FLAG
+ - PARTIALLY_MATCH
+ default: EQUALS
+ description: ' - FEATURE_FLAG: Attribute is feature ID, and value is variation ID.'
featureCloneFeatureCommand:
type: object
properties:
@@ -6675,7 +7671,7 @@ definitions:
type: array
items:
type: object
- $ref: '#/definitions/featureClause'
+ $ref: '#/definitions/bucketeerfeatureClause'
featureSegment:
type: object
properties:
diff --git a/evaluation/typescript/.gitignore b/evaluation/typescript/.gitignore
new file mode 100644
index 0000000000..98f643cfd4
--- /dev/null
+++ b/evaluation/typescript/.gitignore
@@ -0,0 +1,14 @@
+.DS_Store
+
+node_modules
+yarn-error.log
+lib
+__dist
+__lib
+__test
+__e2e
+dist
+.vscode/launch.json
+src/google/
+src/protoc-gen-openapiv2/
+src/proto/
diff --git a/evaluation/typescript/.npmignore b/evaluation/typescript/.npmignore
new file mode 100644
index 0000000000..15f838cd22
--- /dev/null
+++ b/evaluation/typescript/.npmignore
@@ -0,0 +1,30 @@
+.DS_Store
+.vscode
+__dist
+__lib
+__test
+__e2e
+e2e
+example
+src
+tools
+.eslintignore
+.eslintrc.js
+.gitignore
+.nvmrc
+.npmignore
+.prettierignore
+.prettierrc.js
+ava-e2e.config.mjs
+ava-test.config.mjs
+babel-e2e.config.js
+babel-test.config.js
+babel.config.js
+renovate.json
+Makefile
+tsconfig.json
+tsconfig.test.json
+tslint.json
+yarn-error.log
+bootstrap.js
+index.ts
diff --git a/evaluation/typescript/.npmrc b/evaluation/typescript/.npmrc
new file mode 100644
index 0000000000..ae643592e7
--- /dev/null
+++ b/evaluation/typescript/.npmrc
@@ -0,0 +1 @@
+//registry.npmjs.org/:_authToken=${NPM_TOKEN}
diff --git a/evaluation/typescript/.nvmrc b/evaluation/typescript/.nvmrc
new file mode 100644
index 0000000000..58a4133d91
--- /dev/null
+++ b/evaluation/typescript/.nvmrc
@@ -0,0 +1 @@
+16.13.0
diff --git a/evaluation/typescript/.prettierignore b/evaluation/typescript/.prettierignore
new file mode 100644
index 0000000000..a1f21765ba
--- /dev/null
+++ b/evaluation/typescript/.prettierignore
@@ -0,0 +1,4 @@
+**/*.d.ts
+src/google/
+src/protoc-gen-openapiv2/
+src/proto/
\ No newline at end of file
diff --git a/evaluation/typescript/.prettierrc.js b/evaluation/typescript/.prettierrc.js
new file mode 100644
index 0000000000..676ea99f93
--- /dev/null
+++ b/evaluation/typescript/.prettierrc.js
@@ -0,0 +1,6 @@
+module.exports = {
+ printWidth: 100,
+ singleQuote: true,
+ trailingComma: 'all',
+ arrowParens: 'always',
+};
diff --git a/evaluation/typescript/.release-please-manifest.json b/evaluation/typescript/.release-please-manifest.json
new file mode 100644
index 0000000000..b985ff6e79
--- /dev/null
+++ b/evaluation/typescript/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "0.0.1"
+}
diff --git a/evaluation/typescript/Makefile b/evaluation/typescript/Makefile
new file mode 100644
index 0000000000..5ee3c55b5e
--- /dev/null
+++ b/evaluation/typescript/Makefile
@@ -0,0 +1,125 @@
+NPM_BIN_DIR := $(CURDIR)/node_modules/.bin
+GENFILES_DIR := $(CURDIR)/__lib
+
+GIT_REVISION := $(shell git rev-parse --verify HEAD)
+
+export PACKAGE_NAME := $(shell node -p "require('./package.json').name")
+export CURRENT_VERSION := $(shell npm view $(PACKAGE_NAME) version 2>/dev/null || echo 0.0.0)
+export LOCAL_VERSION := $(shell node -p "require('./package.json').version")
+
+.PHONY: init
+init:
+ yarn
+
+.PHONY: clean
+clean:
+ rm -rf $(CURDIR)/__test $(CURDIR)/__lib
+
+.PHONY: build
+build: clean-build tsc copy-proto-external-api-files-to-lib rename-js
+
+.PHONY: clean-build
+clean-build:
+ rm -rf $(GENFILES_DIR)
+
+.PHONY: tsc
+tsc: clean
+ $(NPM_BIN_DIR)/tsc --project tsconfig.json
+ cp -r $(SRC_DIR)/proto __lib/
+
+.PHONY: build_test
+build_test: clean
+ $(NPM_BIN_DIR)/tsc --project tsconfig.test.json
+ cp -r $(SRC_DIR)/proto __test/
+
+.PHONY: rename-js
+rename-js:
+ $(NPM_BIN_DIR)/rename '$(GENFILES_DIR)/**/*.js' '{{f}}.mjs'
+
+.PHONY: test
+test: build_test
+ $(NPM_BIN_DIR)/ava --config ava.config.mjs
+
+.PHONY: fmt
+fmt: tsfmt
+
+.PHONY: tsfmt
+tsfmt:
+ $(NPM_BIN_DIR)/prettier --write '$(CURDIR)/src/**/*.ts'
+
+.PHONY: lint
+lint:
+ $(NPM_BIN_DIR)/eslint
+
+.PHONY: fixLintErrors
+fixLintErrors:
+ $(NPM_BIN_DIR)/eslint . --fix
+
+.PHONY: copy-proto-external-api-files-to-lib
+copy-proto-external-api-files-to-lib:
+ $(NPM_BIN_DIR)/cpx '$(SRC_DIR)/protoc-gen-openapiv2/**/*.{js,d.ts}' $(GENFILES_DIR)/protoc-gen-openapiv2
+ $(NPM_BIN_DIR)/cpx '$(SRC_DIR)/google/**/*.{js,d.ts}' $(GENFILES_DIR)/google
+
+.PHONY: copy-genfiles
+copy-genfiles:
+ @rm -rf $(CURDIR)/lib
+ $(NPM_BIN_DIR)/cpx '$(GENFILES_DIR)/**/*.{mjs,d.ts}' $(CURDIR)/lib
+ $(NPM_BIN_DIR)/cpx '$(GENFILES_DIR)/bucketeer.*' $(CURDIR)/lib
+ @find $(CURDIR)/lib -type f -exec chmod 644 {} +
+ $(NPM_BIN_DIR)/rename '$(CURDIR)/lib/**/*.js' '{{f}}.mjs'
+ $(NPM_BIN_DIR)/babel lib --extensions '.mjs' --config-file "$(CURDIR)/babel.config.js" --out-dir "lib"
+
+.PHONY: publish-dry
+publish-dry: copy-genfiles
+ npm publish --dry-run
+
+.PHONY: publish
+publish: copy-genfiles
+ifeq ($(shell $(NPM_BIN_DIR)/semver -r ">$(CURRENT_VERSION)" $(LOCAL_VERSION) ),$(LOCAL_VERSION))
+ npm publish --access public
+else
+ @echo "$(LOCAL_VERSION) exists. skip publish."
+endif
+
+####################################
+# Generate proto definition files
+####################################
+
+ROOT_DIR := $(CURDIR)/../..
+SRC_DIR := $(CURDIR)/src
+PROTOBUF_INCLUDE_DIR := $(ROOT_DIR)/proto/external/protocolbuffers/protobuf/v23.4
+GOOGLEAPIS := $(ROOT_DIR)/proto/external/googleapis/googleapis/83e756a66b80b072bd234abcfe89edf459090974
+OPENAPI := $(ROOT_DIR)/proto/external/openapiv2
+NPM_BIN_DIR := $(CURDIR)/node_modules/.bin
+
+.PHONY: gen_proto
+gen_proto: clean_proto gen_proto_external_api
+ protoc \
+ --plugin=protoc-gen-ts=$(NPM_BIN_DIR)/protoc-gen-ts \
+ --plugin=protoc-gen-js=$(NPM_BIN_DIR)/protoc-gen-js \
+ --js_out=import_style=commonjs,binary:$(SRC_DIR) \
+ --ts_out=service=grpc-web:$(SRC_DIR) \
+ -I $(ROOT_DIR) \
+ -I $(PROTOBUF_INCLUDE_DIR) \
+ -I $(GOOGLEAPIS) \
+ -I $(OPENAPI) \
+ $(shell find $(ROOT_DIR)/proto -type f -name "*.proto" -not -path "**/external/*.proto" -not -path "**/auth/*.proto" -not -path "**/experiment/*.proto" -not -path "**/test/*.proto" -not -path "**/push/*.proto" -not -path "**/notification/*.proto" -not -path "**/eventpersisterdwh/*.proto" -not -path "**/eventcounter/*.proto" -not -path "**/environment/*.proto" -not -path "**/batch/*.proto" -not -path "**/autoops/*.proto" -not -path "**/auditlog/*.proto" -not -path "**/account/*.proto" -not -path "**/openapi/web_default_settings.proto" -not -path "**/google/protobuf/*.proto" -not -path "**/google/api/*.proto" -not -path "**/protoc-gen-openapiv2/options/*.proto")
+
+
+.PHONY: gen_proto_external_api
+gen_proto_external_api:
+ protoc \
+ --plugin=protoc-gen-ts=$(NPM_BIN_DIR)/protoc-gen-ts \
+ --plugin=protoc-gen-js=$(NPM_BIN_DIR)/protoc-gen-js \
+ --js_out=import_style=commonjs,binary:$(SRC_DIR) \
+ --ts_out=service=grpc-web:$(SRC_DIR) \
+ -I $(PROTOBUF_INCLUDE_DIR) \
+ -I $(GOOGLEAPIS) \
+ -I $(OPENAPI) \
+ $(shell find $(GOOGLEAPIS) -type f -name "*.proto") $(shell find $(OPENAPI) -type f -name "*.proto")
+
+.PHONY: clean_proto
+clean_proto:
+ rm -rf $(SRC_DIR)/proto/
+ rm -rf $(SRC_DIR)/google/
+ rm -rf $(SRC_DIR)/protoc-gen-openapiv2/
\ No newline at end of file
diff --git a/evaluation/typescript/README.md b/evaluation/typescript/README.md
new file mode 100644
index 0000000000..14b3cce3f1
--- /dev/null
+++ b/evaluation/typescript/README.md
@@ -0,0 +1,9 @@
+# Evaluation module for Node.JS
+
+## Setup
+```export NPM_TOKEN="YOUR_NPM_TOKEN"```
+```make init```
+```make copy_proto_generated_code```
+
+## Unit tests
+```make test```
\ No newline at end of file
diff --git a/evaluation/typescript/babel.config.js b/evaluation/typescript/babel.config.js
new file mode 100644
index 0000000000..8efd6783ce
--- /dev/null
+++ b/evaluation/typescript/babel.config.js
@@ -0,0 +1,7 @@
+module.exports = function (api) {
+ api.cache(true);
+
+ return {
+ presets: ['@babel/preset-env'],
+ };
+};
diff --git a/evaluation/typescript/eslint.config.mjs b/evaluation/typescript/eslint.config.mjs
new file mode 100644
index 0000000000..a6a2a5ed82
--- /dev/null
+++ b/evaluation/typescript/eslint.config.mjs
@@ -0,0 +1,27 @@
+import tsEslint from 'typescript-eslint';
+import tsParser from '@typescript-eslint/parser';
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
+
+export default [
+ {
+ files: ['src/**/*.ts', 'test/**/*.ts'],
+ ignores: ['**/*.d.ts', 'src/google/', 'src/protoc-gen-openapiv2/', 'src/proto/'],
+ languageOptions: {
+ parser: tsParser,
+ parserOptions: {
+ sourceType: 'module',
+ project: [`tsconfig.json`, `tsconfig.test.json`],
+ },
+ globals: {
+ node: true,
+ },
+ },
+ plugins: {
+ ...tsEslint.configs.recommended,
+ eslintPluginPrettierRecommended,
+ },
+ rules: {
+ quotes: ['error', 'single', { avoidEscape: true }],
+ },
+ },
+];
diff --git a/evaluation/typescript/package.json b/evaluation/typescript/package.json
new file mode 100644
index 0000000000..1c977167fd
--- /dev/null
+++ b/evaluation/typescript/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@bucketeer/evaluation",
+ "version": "0.0.1",
+ "description": "",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "@improbable-eng/grpc-web": "^0.15.0",
+ "@types/fnv-plus": "^1.3.2",
+ "@types/google-protobuf": "^3.15.12",
+ "@types/semver": "^7.5.8",
+ "google-protobuf": "3.14.0",
+ "fnv-plus": "^1.3.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.8.0",
+ "@types/eslint": "^9.6.0",
+ "@types/eslint__js": "^8.42.3",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/parser": "^8.0.0",
+ "@babel/cli": "7.24.8",
+ "@babel/core": "7.25.2",
+ "@babel/preset-env": "7.25.3",
+ "@babel/preset-typescript": "7.24.7",
+ "@bazel/hide-bazel-files": "1.7.0",
+ "@bazel/rollup": "5.8.1",
+ "@bazel/terser": "5.8.1",
+ "@bazel/typescript": "5.8.1",
+ "ava": "6.1.3",
+ "cpx": "1.5.0",
+ "eslint": "^9.8.0",
+ "eslint-config-prettier": "9.1.0",
+ "eslint-plugin-prettier": "5.2.1",
+ "msw": "^2.3.5",
+ "prettier": "3.3.3",
+ "protoc-gen-js": "^3.21.2",
+ "rename-cli": "6.2.1",
+ "replace": "1.2.2",
+ "ts-protoc-gen": "0.15.0",
+ "tsx": "^4.19.1",
+ "typescript": "^5.5.4",
+ "typescript-eslint": "^8.7.0"
+ }
+}
diff --git a/evaluation/typescript/release-please-config.json b/evaluation/typescript/release-please-config.json
new file mode 100644
index 0000000000..8204bc8057
--- /dev/null
+++ b/evaluation/typescript/release-please-config.json
@@ -0,0 +1,22 @@
+{
+ "bump-minor-pre-major": true,
+ "bump-patch-for-minor-pre-major": true,
+ "draft": false,
+ "prerelease": false,
+ "draft-pull-request": true,
+ "changelog-sections": [
+ {"type":"feat","section":"Features","hidden":false},
+ {"type":"fix","section":"Bug Fixes","hidden":false},
+ {"type":"chore","section":"Miscellaneous","hidden":false},
+ {"type":"perf","section":"Performance Improvements","hidden":false},
+ {"type":"revert","section":"Reverts","hidden":false},
+ {"type":"build","section":"Build System","hidden":false}
+ ],
+ "release-type": "node",
+ "packages": {
+ ".": {
+ "changelog-path": "CHANGELOG.md"
+ }
+ },
+ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
+}
diff --git a/evaluation/typescript/src/__tests__/clause_evaluator_test.ts b/evaluation/typescript/src/__tests__/clause_evaluator_test.ts
new file mode 100644
index 0000000000..0a5fb4329d
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/clause_evaluator_test.ts
@@ -0,0 +1,1509 @@
+import test from 'ava';
+import { Clause } from '../proto/feature/clause_pb';
+import { ClauseEvaluator } from '../clauseEvaluator';
+import { SegmentEvaluatorTestCases } from './segment_evaluator_test';
+
+const clauseEvaluator = new ClauseEvaluator();
+
+test('GreaterFloat', (t) => {
+ const testCases = [
+ // Int
+ { targetValue: '1', values: ['1'], expected: false },
+ { targetValue: '1', values: ['1', '2', '3'], expected: false },
+ { targetValue: '1', values: ['a', '1', '2.0'], expected: false },
+ { targetValue: '1', values: ['a', 'b', 'c'], expected: false },
+ { targetValue: '1', values: ['0a', '1a'], expected: false },
+ { targetValue: '1', values: ['0'], expected: true },
+ { targetValue: '1', values: ['0.0', '1.0', '2.0'], expected: true },
+ { targetValue: '1', values: ['0.9', '1.0', '2.0'], expected: true },
+ { targetValue: '1', values: ['0', '1', '2'], expected: true },
+ { targetValue: '1', values: ['a', '0', '1.0'], expected: true },
+ { targetValue: '1', values: ['a', '0', '1'], expected: true },
+ { targetValue: '1', values: ['0a', '0'], expected: true },
+ // Float
+ { targetValue: '1.0', values: ['1.0', '2.0', '3.0'], expected: false },
+ { targetValue: '1.0', values: ['1', '2', '3'], expected: false },
+ { targetValue: '1.0', values: ['a', '1', '2.0'], expected: false },
+ { targetValue: '1.0', values: ['a', 'b', 'c'], expected: false },
+ { targetValue: '1.0', values: ['0', '1.0', '2.0'], expected: true },
+ { targetValue: '1.0', values: ['a', '0.0', '1.0'], expected: true },
+ { targetValue: '1.2', values: ['a', '1.1', '2.0'], expected: true },
+ ];
+
+ testCases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed : targetValue ${tc.targetValue} : value ${tc.values}`,
+ );
+ });
+});
+
+test('GreaterSemver', (t) => {
+ const testCases = [
+ { targetValue: '1.0.0', values: ['1.0.0', '0.0', '1.0.1'], expected: false },
+ // This case is difference with golang version which expected: false.
+ // Because node.js semver is able to parse v0.0.7 to 0.0.7, 1.0.9-alpha to 1.0.9
+ { targetValue: '1.0.0', values: ['1.0.0', '1.0.1', 'v0.0.7'], expected: true },
+ { targetValue: '1.0.0', values: ['1.0.0', '1.0.1', '0.0.7a'], expected: false },
+ { targetValue: '1.0.0', values: ['1.0.0', '1.0.1', 'a-0.0.7'], expected: false },
+
+ { targetValue: '0.0.8', values: ['1.0.0', '0.0.9', '1.0.1'], expected: false },
+
+ // This case is difference with golang version which expected: false.
+ { targetValue: '1.1.0', values: ['1.1.0', 'v1.0.9', '1.1.1'], expected: true },
+
+ { targetValue: '1.1.0', values: ['1.1.0', '1.0.9-alpha', '1.1.1'], expected: true },
+ { targetValue: '1.1.0', values: ['1.1.0', '1.0.9a', '1.1.1'], expected: false },
+
+ // This case is difference with golang version which expected: false.
+ { targetValue: '2.1.0', values: ['2.1.0', 'v2.0.9', '2.1.1'], expected: true },
+
+ { targetValue: '1.0.1', values: ['1.0.1', '1.0.0', 'v0.0.7'], expected: true },
+ { targetValue: '1.1.1', values: ['1.1.1', 'v1.0.9', '1.1.0'], expected: true },
+ { targetValue: '2.1.1', values: ['2.1.1', 'v2.0.9', '2.1.0'], expected: true },
+ ];
+
+ testCases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(result, tc.expected, `Test case ${i} failed`);
+ });
+});
+
+test('TestGreaterString', (t) => {
+ const testcases = [
+ {
+ targetValue: 'b',
+ values: ['c', 'd', 'e'],
+ expected: false,
+ },
+ {
+ targetValue: 'v1.0.0',
+ values: ['v2.0.0', 'v1.0.9', 'v1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: 'b',
+ values: ['1', 'a', '2.0'],
+ expected: true,
+ },
+ {
+ targetValue: 'b',
+ values: ['c', 'd', 'a'],
+ expected: true,
+ },
+ {
+ targetValue: 'v1.0.0',
+ values: ['v1.0.0', 'v1.0.9', 'v0.0.9'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed : targetValue ${tc.targetValue} : value ${tc.values}`,
+ );
+ });
+});
+
+test('TestGreaterOrEqualFloat', (t) => {
+ const testcases = [
+ // Int test cases
+ {
+ targetValue: '1',
+ values: ['2'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['2', '3', '4'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['2.0', '3.0', '4.0'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['a', '2', '3.0'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['0a', '1a'],
+ expected: false,
+ },
+ {
+ targetValue: '1',
+ values: ['1'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['0', '1', '2'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['0.0', '1.0', '2.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['1.0', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['1', '2', '3'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['a', '0', '1.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['a', '0', '1'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['a', '1', '2.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['a', '1.0', '2'],
+ expected: true,
+ },
+ {
+ targetValue: '1',
+ values: ['0a', '0'],
+ expected: true,
+ },
+ // Float test cases
+ {
+ targetValue: '1.0',
+ values: ['2.0', '3.0', '4.0'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0',
+ values: ['2', '3', '4'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0',
+ values: ['a', '1.1', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0',
+ values: ['0.9', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0',
+ values: ['a', '0', '2.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1',
+ values: ['1', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1',
+ values: ['1.1', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1',
+ values: ['a', '1.0', '2.0'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER_OR_EQUAL); // Greater or Equal operator
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestGreaterOrEqualSemver', (t) => {
+ const testcases = [
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.1', '0.0', '1.0.2'],
+ expected: false,
+ },
+ // This case is difference with golang version which expected: false.
+ // Because node.js semver is able to parse v0.0.7 to 0.0.7, 1.0.9-alpha to 1.0.9
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.1', '1.0.2', 'v0.0.7'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.1', '1.0.2', '0.0.7-alpha'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.1', '1.0.2', '0.0.7a'],
+ expected: false,
+ },
+ {
+ targetValue: '0.0.8',
+ values: ['1.0.0', '0.0.9', '1.0.1'],
+ expected: false,
+ },
+ // This case is difference with golang version which expected: false.
+ {
+ targetValue: '1.1.0',
+ values: ['1.1.1', 'v1.0.9', '1.1.2'],
+ expected: true,
+ },
+ // This case is difference with golang version which expected: false.
+ {
+ targetValue: '2.1.0',
+ values: ['2.1.1', 'v2.0.9', '2.1.2'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.1', '1.0.0', 'v0.0.7'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.2', 'v1.0.9', '1.1.1'],
+ expected: true,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.2', 'v2.0.9', '2.1.1'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.2', '1.0.1', 'v0.0.7'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.2', 'v1.0.9', '1.1.0'],
+ expected: true,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.2', 'v2.0.9', '2.1.0'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER_OR_EQUAL);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestGreaterOrEqualString', (t) => {
+ const testcases = [
+ {
+ targetValue: 'b',
+ values: ['c', 'd', 'e'],
+ expected: false,
+ },
+ {
+ targetValue: 'v1.0.0',
+ values: ['v2.0.0', 'v1.0.9', 'v1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: 'b',
+ values: ['1', 'a', '2.0'],
+ expected: true,
+ },
+ {
+ targetValue: 'b',
+ values: ['d', 'c', 'b'],
+ expected: true,
+ },
+ {
+ targetValue: 'b',
+ values: ['c', 'd', 'a'],
+ expected: true,
+ },
+ {
+ targetValue: 'b',
+ values: ['d', 'c', 'b'],
+ expected: true,
+ },
+ {
+ targetValue: 'v1.0.0',
+ values: ['v1.0.8', 'v1.0.9', 'v1.0.0'],
+ expected: true,
+ },
+ {
+ targetValue: 'v1.0.0',
+ values: ['v1.0.8', 'v1.0.9', 'v0.0.9'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.GREATER_OR_EQUAL);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessThanSemver', (t) => {
+ const testcases = [
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.0', '0.0', '0.0.9'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0.0',
+ values: ['1.0.0', 'v0.0.8', '0.0.7'],
+ expected: false,
+ },
+ {
+ targetValue: '0.0.8',
+ values: ['0.0.8', '0.0.7', 'v0.0.9'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.0',
+ values: ['1.1.0', 'v1.0.9', '1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: '2.1.0',
+ values: ['2.1.0', 'v2.0.9', '2.0.9'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.1', 'v0.0.7', '1.0.2'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.1', 'v1.0.9', '1.1.2'],
+ expected: true,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.1', 'v2.0.9', '2.1.2'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessFloat', (t) => {
+ const testcases = [
+ // Int cases
+ {
+ targetValue: '3',
+ values: ['3'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['1', '2', '3'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '1', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['0a', '1a'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['2.0', '3.0', '4.0'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['1.0', '2.0', '3.1'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['2', '3', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['d', '3', '3.5'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '0', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['4a', '4'],
+ expected: true,
+ },
+ // Float cases
+ {
+ targetValue: '3.0',
+ values: ['1.0', '2.0', '3.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['1', '2', '3'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', '1', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['2', '3.0', '3.1'],
+ expected: true,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', '0.0', '3.9'],
+ expected: true,
+ },
+ {
+ targetValue: '3.2',
+ values: ['a', '1.1', '3.5'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessString', (t) => {
+ const testcases = [
+ {
+ targetValue: 'c',
+ values: ['c', 'b', 'a'],
+ expected: false,
+ },
+ {
+ targetValue: 'c',
+ values: ['1', 'a', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: 'v2.0.0',
+ values: ['v2.0.0', 'v1.0.9', 'v1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: 'c',
+ values: ['b', 'c', 'd'],
+ expected: true,
+ },
+ {
+ targetValue: 'c',
+ values: ['3', '1.0', 'd'],
+ expected: true,
+ },
+ {
+ targetValue: 'v2.0.0',
+ values: ['v1.0.0', 'v1.0.9', 'v2.1.0'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessOrEqualFloat', (t) => {
+ const testcases = [
+ // Int
+ {
+ targetValue: '3',
+ values: ['2'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['0', '1', '2'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['0', '1.0', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '1', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['3a', '4a'],
+ expected: false,
+ },
+ {
+ targetValue: '3',
+ values: ['3'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['2', '3', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['1.0', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['1.0', '2.0', '3.1'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['1', '2', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '1.0', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['a', '1', '3.5'],
+ expected: true,
+ },
+ {
+ targetValue: '3',
+ values: ['3a', '3'],
+ expected: true,
+ },
+ // Float
+ {
+ targetValue: '3.0',
+ values: ['0', '1.0', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['0', '1', '2'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', '1.1', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: '3.0',
+ values: ['0.9', '2.0', '3.0'],
+ expected: true,
+ },
+ {
+ targetValue: '3.0',
+ values: ['a', '0', '3.1'],
+ expected: true,
+ },
+ {
+ targetValue: '3.1',
+ values: ['1', '2.0', '3.9'],
+ expected: true,
+ },
+ {
+ targetValue: '3.1',
+ values: ['1.1', '2.0', '4'],
+ expected: true,
+ },
+ {
+ targetValue: '3.1',
+ values: ['a', '1.0', '3.1'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS_OR_EQUAL);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessThanOrEqualSemver', (t) => {
+ const testcases = [
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.0', '0.0', '0.0.9'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.0', 'v0.0.8', '0.0.7'],
+ expected: false,
+ },
+ {
+ targetValue: '0.0.9',
+ values: ['0.0.8', '0.0.7', 'v0.0.9'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.0', 'v1.0.9', '1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.0', 'v2.0.9', '2.0.9'],
+ expected: false,
+ },
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.1', 'v0.0.7', '1.0.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.1', 'v1.0.9', '1.1.0'],
+ expected: true,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.1', 'v2.0.9', '2.1.0'],
+ expected: true,
+ },
+ {
+ targetValue: '1.0.1',
+ values: ['1.0.0', 'v0.0.7', '1.0.2'],
+ expected: true,
+ },
+ {
+ targetValue: '1.1.1',
+ values: ['1.1.0', 'v1.0.9', '1.1.2'],
+ expected: true,
+ },
+ {
+ targetValue: '2.1.1',
+ values: ['2.1.0', 'v2.0.9', '2.1.2'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS_OR_EQUAL);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestLessOrEqualString', (t) => {
+ const testcases = [
+ {
+ targetValue: 'd',
+ values: ['a', 'b', 'c'],
+ expected: false,
+ },
+ {
+ targetValue: 'c',
+ values: ['1', 'a', '2.0'],
+ expected: false,
+ },
+ {
+ targetValue: 'v2.0.0',
+ values: ['v1.0.0', 'v1.0.9', 'v1.0.8'],
+ expected: false,
+ },
+ {
+ targetValue: 'c',
+ values: ['3.0', 'c', 'b'],
+ expected: true,
+ },
+ {
+ targetValue: 'c',
+ values: ['c', 'b', 'a'],
+ expected: true,
+ },
+ {
+ targetValue: 'c',
+ values: ['a', 'b', 'd'],
+ expected: true,
+ },
+ {
+ targetValue: 'v2.0.0',
+ values: ['v1.0.0', 'v1.0.9', 'v2.0.0'],
+ expected: true,
+ },
+ {
+ targetValue: 'v2.0.0',
+ values: ['v1.0.0', 'v1.0.9', 'v2.0.1'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.LESS_OR_EQUAL); // LESS_OR_EQUAL operator
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestBeforeInt', (t) => {
+ const testcases = [
+ // Int
+ {
+ targetValue: '1519223320',
+ values: ['1419223320'],
+ expected: false,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1619223320'],
+ expected: true,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519200000'],
+ expected: false,
+ },
+ // Strings
+ {
+ targetValue: '15192XXX23320',
+ values: ['1519223330', '1519223311', '1519223300'],
+ expected: false,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519200000', '15192XXX23300'],
+ expected: false,
+ },
+ // Float
+ {
+ // TODO: review me again
+ // This case is difference with golang version which expected: false.
+ // when parse `15192233.30` to int, it shoule be `15192233`
+ // So 15192233 is before 1519223330, 1519223311, 1519223300
+ targetValue: '15192233.30',
+ values: ['1519223330', '1519223311', '1519223300'],
+ expected: true,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519200000', '15192233.00'],
+ expected: false,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.BEFORE); // BEFORE operator
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+test('TestAfterInt', (t) => {
+ const testcases = [
+ // Int
+ {
+ targetValue: '1519223320',
+ values: ['1419223320'],
+ expected: true,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1619223320'],
+ expected: false,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519223319'],
+ expected: true,
+ },
+ // Strings
+ {
+ targetValue: '15192XXX23320',
+ values: ['1519223330', '1519223311', '1519223300'],
+ expected: false,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519200000', '15192XXX23300'],
+ expected: true,
+ },
+ // Float
+ {
+ targetValue: '15192233.30',
+ values: ['1519223330', '1519223311', '1519223300'],
+ expected: false,
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1519200000', '15192233.00'],
+ expected: true,
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.AFTER);
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+// TestInOperator does not exist on the Go version testcases
+test('TestInOperator', (t) => {
+ const testcases = [
+ // Exact match
+ {
+ targetValue: '1519223320',
+ values: ['1519223320', '1419223320', '1619223320'],
+ expected: true, // The targetValue exists in the values array
+ },
+ {
+ targetValue: '1519223321',
+ values: ['1519223320', '1419223320', '1619223320'],
+ expected: false, // The targetValue does not exist in the values array
+ },
+ // Strings
+ {
+ targetValue: 'apple',
+ values: ['banana', 'orange', 'apple'],
+ expected: true, // The targetValue exists in the values array
+ },
+ {
+ targetValue: 'grape',
+ values: ['banana', 'orange', 'apple'],
+ expected: false, // The targetValue does not exist in the values array
+ },
+ // Numbers as strings
+ {
+ targetValue: '123',
+ values: ['456', '789', '123'],
+ expected: true, // The targetValue exists in the values array
+ },
+ {
+ targetValue: '321',
+ values: ['456', '789', '123'],
+ expected: false, // The targetValue does not exist in the values array
+ },
+ // Mixed types
+ {
+ targetValue: '123',
+ values: ['123', 'apple', 'banana'],
+ expected: true, // The targetValue exists in the values array
+ },
+ {
+ targetValue: 'apple',
+ values: ['123', '456', '789'],
+ expected: false, // The targetValue does not exist in the values array
+ },
+ // Empty values list
+ {
+ targetValue: 'anything',
+ values: [],
+ expected: false, // The values array is empty, so targetValue cannot exist
+ },
+ // Case sensitivity
+ {
+ targetValue: 'Apple',
+ values: ['apple', 'banana', 'cherry'],
+ expected: false, // Case-sensitive comparison, 'Apple' != 'apple'
+ },
+ {
+ targetValue: 'apple',
+ values: ['apple', 'banana', 'cherry'],
+ expected: true, // Exact match, case-sensitive
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.IN); // Change operator to 'IN'
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+// TestStartsWithOperator does not exist on the Go version testcases
+test('TestStartsWithOperator', (t) => {
+ const testcases = [
+ // Exact starts with match
+ {
+ targetValue: '1519223320',
+ values: ['1519'],
+ expected: true, // targetValue starts with '1519'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1619'],
+ expected: false, // targetValue does not start with '1619'
+ },
+ // Multiple possible prefixes
+ {
+ targetValue: '1519223320',
+ values: ['1519', '1419', '1319'],
+ expected: true, // targetValue starts with '1519'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1619', '1719', '1819'],
+ expected: false, // targetValue does not start with any of these values
+ },
+ // Full match is also a valid "starts with"
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // targetValue fully matches the value, so it starts with 'apple'
+ },
+ // String comparisons
+ {
+ targetValue: 'banana',
+ values: ['ban'],
+ expected: true, // targetValue starts with 'ban'
+ },
+ {
+ targetValue: 'banana',
+ values: ['ba', 'ban', 'bana'],
+ expected: true, // targetValue starts with 'ban' or 'ba' or 'bana'
+ },
+ {
+ targetValue: 'banana',
+ values: ['car', 'dog'],
+ expected: false, // targetValue does not start with any of these values
+ },
+ // Numbers as strings
+ {
+ targetValue: '123456',
+ values: ['123'],
+ expected: true, // targetValue starts with '123'
+ },
+ {
+ targetValue: '123456',
+ values: ['456'],
+ expected: false, // targetValue does not start with '456'
+ },
+ // Mixed strings and numbers
+ {
+ targetValue: 'hello123',
+ values: ['hello'],
+ expected: true, // targetValue starts with 'hello'
+ },
+ {
+ targetValue: 'hello123',
+ values: ['123'],
+ expected: false, // targetValue does not start with '123'
+ },
+ // Empty values list
+ {
+ targetValue: 'anything',
+ values: [],
+ expected: false, // An empty list means no prefix matches, so it should return false
+ },
+ // Case sensitivity
+ {
+ targetValue: 'Apple',
+ values: ['apple'],
+ expected: false, // Case-sensitive comparison, 'Apple' does not start with 'apple'
+ },
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // Exact match, targetValue starts with 'apple'
+ },
+ // Special characters
+ {
+ targetValue: 'hello_world',
+ values: ['hello_'],
+ expected: true, // targetValue starts with 'hello_'
+ },
+ {
+ targetValue: 'hello_world',
+ values: ['world'],
+ expected: false, // targetValue does not start with 'world'
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.STARTS_WITH); // Change operator to 'STARTS_WITH'
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+// TestEndsWithOperator does not exist on the Go version testcases
+test('TestEndsWithOperator', (t) => {
+ const testcases = [
+ // Simple ends with match
+ {
+ targetValue: '1519223320',
+ values: ['3320'],
+ expected: true, // targetValue ends with '3320'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['3321'],
+ expected: false, // targetValue does not end with '3321'
+ },
+ // Multiple possible suffixes
+ {
+ targetValue: '1519223320',
+ values: ['3320', '1234', '5678'],
+ expected: true, // targetValue ends with '3320'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['1234', '5678'],
+ expected: false, // targetValue does not end with any of these values
+ },
+ // Full match is also a valid "ends with"
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // targetValue fully matches, so it ends with 'apple'
+ },
+ // String comparisons
+ {
+ targetValue: 'banana',
+ values: ['nana'],
+ expected: true, // targetValue ends with 'nana'
+ },
+ {
+ targetValue: 'banana',
+ values: ['ana', 'na', 'nana'],
+ expected: true, // targetValue ends with 'nana', 'ana', or 'na'
+ },
+ {
+ targetValue: 'banana',
+ values: ['car', 'dog'],
+ expected: false, // targetValue does not end with any of these values
+ },
+ // Numbers as strings
+ {
+ targetValue: '123456',
+ values: ['456'],
+ expected: true, // targetValue ends with '456'
+ },
+ {
+ targetValue: '123456',
+ values: ['123'],
+ expected: false, // targetValue does not end with '123'
+ },
+ // Mixed strings and numbers
+ {
+ targetValue: 'hello123',
+ values: ['123'],
+ expected: true, // targetValue ends with '123'
+ },
+ {
+ targetValue: 'hello123',
+ values: ['hello'],
+ expected: false, // targetValue does not end with 'hello'
+ },
+ // Empty values list
+ {
+ targetValue: 'anything',
+ values: [],
+ expected: false, // An empty list means no suffix matches, so it should return false
+ },
+ // Case sensitivity
+ {
+ targetValue: 'Apple',
+ values: ['apple'],
+ expected: false, // Case-sensitive comparison, 'Apple' does not end with 'apple'
+ },
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // Exact match, targetValue ends with 'apple'
+ },
+ // Special characters
+ {
+ targetValue: 'hello_world',
+ values: ['_world'],
+ expected: true, // targetValue ends with '_world'
+ },
+ {
+ targetValue: 'hello_world',
+ values: ['hello'],
+ expected: false, // targetValue does not end with 'hello'
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.ENDS_WITH); // Change operator to 'ENDS_WITH'
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+// TestEndsWithOperator does not exist on the Go version testcases
+test('TestPartiallyMatchesOperator', (t) => {
+ const testcases = [
+ // Simple partial match
+ {
+ targetValue: '1519223320',
+ values: ['922'],
+ expected: true, // targetValue contains '922'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['333'],
+ expected: false, // targetValue does not contain '333'
+ },
+ // Multiple possible matches
+ {
+ targetValue: '1519223320',
+ values: ['333', '223', '920'],
+ expected: true, // targetValue contains '223'
+ },
+ {
+ targetValue: '1519223320',
+ values: ['333', '222', '920'],
+ expected: false, // targetValue does not contain any of these values
+ },
+ {
+ targetValue: '1519223320',
+ values: ['555', '666', '777'],
+ expected: false, // targetValue does not contain any of these values
+ },
+ // Full match is valid as a partial match
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // targetValue contains 'apple' fully
+ },
+ // String comparisons
+ {
+ targetValue: 'banana',
+ values: ['nan'],
+ expected: true, // targetValue contains 'nan'
+ },
+ {
+ targetValue: 'banana',
+ values: ['ana', 'ban'],
+ expected: true, // targetValue contains 'ana' and 'ban'
+ },
+ {
+ targetValue: 'banana',
+ values: ['car', 'dog'],
+ expected: false, // targetValue does not contain 'car' or 'dog'
+ },
+ // Numbers as strings
+ {
+ targetValue: '123456',
+ values: ['234'],
+ expected: true, // targetValue contains '234'
+ },
+ {
+ targetValue: '123456',
+ values: ['789'],
+ expected: false, // targetValue does not contain '789'
+ },
+ // Mixed strings and numbers
+ {
+ targetValue: 'hello123',
+ values: ['123'],
+ expected: true, // targetValue contains '123'
+ },
+ {
+ targetValue: 'hello123',
+ values: ['hello'],
+ expected: true, // targetValue contains 'hello'
+ },
+ {
+ targetValue: 'hello123',
+ values: ['world'],
+ expected: false, // targetValue does not contain 'world'
+ },
+ // Empty values list
+ {
+ targetValue: 'anything',
+ values: [],
+ expected: false, // An empty list means no partial match, so it should return false
+ },
+ // Case sensitivity
+ {
+ targetValue: 'Apple',
+ values: ['apple'],
+ expected: false, // Case-sensitive comparison, 'Apple' does not contain 'apple'
+ },
+ {
+ targetValue: 'apple',
+ values: ['apple'],
+ expected: true, // Exact match is valid for partial match
+ },
+ // Special characters
+ {
+ targetValue: 'hello_world',
+ values: ['_world'],
+ expected: true, // targetValue contains '_world'
+ },
+ {
+ targetValue: 'hello_world',
+ values: ['hello'],
+ expected: true, // targetValue contains 'hello'
+ },
+ {
+ targetValue: 'hello_world',
+ values: ['world'],
+ expected: true, // targetValue contains 'world'
+ },
+ {
+ targetValue: 'hello_world',
+ values: ['!'],
+ expected: false, // targetValue does not contain '!'
+ },
+ ];
+
+ const clauseEvaluator = new ClauseEvaluator();
+
+ testcases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.PARTIALLY_MATCH); // Change operator to 'PARTIALLY_MATCH'
+ clause.setValuesList(tc.values);
+
+ const result = clauseEvaluator.evaluate(tc.targetValue, clause, 'userId', [], {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: targetValue ${tc.targetValue} : values ${tc.values}`,
+ );
+ });
+});
+
+// TestSegementMatchesOperator does not exist on the Go version testcases
+test('TestSegementMatchesOperator', (t) => {
+ const clauseEvaluator = new ClauseEvaluator();
+
+ SegmentEvaluatorTestCases.forEach((tc, i) => {
+ const clause = new Clause();
+ clause.setOperator(Clause.Operator.SEGMENT);
+ clause.setValuesList(tc.segmentIDs);
+ const result = clauseEvaluator.evaluate('', clause, tc.userID, tc.segmentUsers, {});
+ t.is(
+ result,
+ tc.expected,
+ `Test case ${i} failed: userID ${tc.userID} : segmentUsers ${tc.segmentUsers}`,
+ );
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/dependency_evaluator_test.ts b/evaluation/typescript/src/__tests__/dependency_evaluator_test.ts
new file mode 100644
index 0000000000..c40390b442
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/dependency_evaluator_test.ts
@@ -0,0 +1,53 @@
+import test from 'ava';
+import { DependencyEvaluator } from '../dependencyEvaluator';
+import { EVALUATOR_ERRORS } from '../errors';
+// Define the type for the test cases
+interface TestCase {
+ desc: string;
+ targetFeatureID: string;
+ variationIDs: string[];
+ flagVariations: Record;
+ expected: boolean;
+ expectedErr: Error | null;
+}
+
+const patterns: TestCase[] = [
+ {
+ desc: 'err: depended feature not found',
+ targetFeatureID: 'feature-1',
+ variationIDs: ['variation-1', 'variation-2'],
+ flagVariations: {},
+ expected: false,
+ expectedErr: EVALUATOR_ERRORS.FeatureNotFound,
+ },
+ {
+ desc: 'not matched',
+ targetFeatureID: 'feature-1',
+ variationIDs: ['variation-1', 'variation-2'],
+ flagVariations: { 'feature-1': 'variation-3' },
+ expected: false,
+ expectedErr: null,
+ },
+ {
+ desc: 'success',
+ targetFeatureID: 'feature-1',
+ variationIDs: ['variation-1', 'variation-2'],
+ flagVariations: { 'feature-1': 'variation-2' },
+ expected: true,
+ expectedErr: null,
+ },
+];
+
+patterns.forEach(
+ ({ desc, targetFeatureID, variationIDs, flagVariations, expected, expectedErr }) => {
+ test(desc, (t) => {
+ const dEval = new DependencyEvaluator();
+ try {
+ const actual = dEval.evaluate(targetFeatureID, variationIDs, flagVariations);
+ t.deepEqual(actual, expected);
+ } catch (error) {
+ t.deepEqual(error, expectedErr);
+ }
+ });
+ },
+);
diff --git a/evaluation/typescript/src/__tests__/evaluator/assign_user_default_strategy_test.ts b/evaluation/typescript/src/__tests__/evaluator/assign_user_default_strategy_test.ts
new file mode 100644
index 0000000000..6defe25911
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/assign_user_default_strategy_test.ts
@@ -0,0 +1,27 @@
+import test from 'ava';
+import { createUser } from '../../modelFactory';
+import { newTestFeature } from './evaluate_feature_test';
+import { Evaluator } from '../../evaluation';
+import { Reason } from '../../proto/feature/reason_pb';
+
+test('no default strategy', (t) => {
+ const user = createUser('user-id1', { name3: 'user3' });
+ const f = newTestFeature('test-feature');
+ f.clearDefaultStrategy();
+ const evalator = new Evaluator();
+ try {
+ evalator.assignUser(f, user, [], {});
+ t.fail('should throw an error "evaluator: default strategy not found"');
+ } catch (error) {
+ t.deepEqual(error, new Error('evaluator: default strategy not found'));
+ }
+});
+
+test('with default strategy', (t) => {
+ const user = createUser('user-id1', { name3: 'user3' });
+ const f = newTestFeature('test-feature');
+ const evalator = new Evaluator();
+ const [reason, variation] = evalator.assignUser(f, user, [], {});
+ t.is(reason.getType(), Reason.Type.DEFAULT);
+ t.is(variation.getId(), 'variation-B');
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/assign_user_off_variationt_test.ts b/evaluation/typescript/src/__tests__/evaluator/assign_user_off_variationt_test.ts
new file mode 100644
index 0000000000..69cdd094bb
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/assign_user_off_variationt_test.ts
@@ -0,0 +1,125 @@
+import test from 'ava';
+import { createPrerequisite, createReason, createUser } from '../../modelFactory';
+import { Prerequisite } from '../../proto/feature/prerequisite_pb';
+import { Reason } from '../../proto/feature/reason_pb';
+import { Variation } from '../../proto/feature/variation_pb';
+import { newTestFeature, TestVariations } from './evaluate_feature_test';
+import { Evaluator } from '../../evaluation';
+
+interface TestCases {
+ enabled: boolean;
+ offVariation: string;
+ userID: string;
+ flagVariations: Record;
+ prerequisite: Prerequisite[];
+ expectedReason: Reason;
+ expectedVariation: Variation | null;
+ expectedError: Error | null;
+}
+
+const TestCases: TestCases[] = [
+ {
+ enabled: false,
+ offVariation: 'variation-C',
+ userID: 'user5',
+ flagVariations: {},
+ prerequisite: [],
+ expectedReason: createReason('', Reason.Type.OFF_VARIATION),
+ expectedVariation: TestVariations.variationC,
+ expectedError: null,
+ },
+ {
+ enabled: false,
+ offVariation: '',
+ userID: 'user5',
+ flagVariations: {},
+ prerequisite: [],
+ expectedReason: createReason('', Reason.Type.DEFAULT),
+ expectedVariation: TestVariations.variationB,
+ expectedError: null,
+ },
+ {
+ enabled: false,
+ offVariation: 'variation-E',
+ userID: 'user5',
+ flagVariations: {},
+ prerequisite: [],
+ expectedReason: createReason('', Reason.Type.OFF_VARIATION),
+ expectedVariation: null,
+ expectedError: new Error('evaluator: variation not found'),
+ },
+ {
+ enabled: true,
+ offVariation: '',
+ userID: 'user4',
+ flagVariations: {},
+ prerequisite: [],
+ expectedReason: createReason('', Reason.Type.DEFAULT),
+ expectedVariation: TestVariations.variationB,
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: 'variation-C',
+ userID: 'user4',
+ flagVariations: {},
+ prerequisite: [],
+ expectedReason: createReason('', Reason.Type.DEFAULT),
+ expectedVariation: TestVariations.variationB,
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: 'variation-C',
+ userID: 'user4',
+ flagVariations: {
+ 'test-feature2': 'variation A', // not matched with expected prerequisites variations
+ },
+ prerequisite: [createPrerequisite('test-feature2', 'variation D')],
+ expectedReason: createReason('', Reason.Type.PREREQUISITE),
+ expectedVariation: TestVariations.variationC,
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: 'variation-C',
+ userID: 'user4',
+ flagVariations: {
+ 'test-feature2': 'variation D', // matched with expected prerequisites variations
+ },
+ prerequisite: [createPrerequisite('test-feature2', 'variation D')],
+ expectedReason: createReason('', Reason.Type.DEFAULT),
+ expectedVariation: TestVariations.variationB,
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: 'variation-C',
+ userID: 'user4',
+ flagVariations: {}, // not found prerequisite variation
+ prerequisite: [createPrerequisite('test-feature2', 'variation D')],
+ expectedReason: createReason('', Reason.Type.PREREQUISITE),
+ expectedVariation: null,
+ expectedError: new Error('evaluator: prerequisite variation not found'),
+ },
+];
+
+TestCases.forEach((tc, index) => {
+ test(`Test Case ${index}`, async (t) => {
+ const user = createUser(tc.userID, {});
+ const f = newTestFeature('test-feature');
+ f.setEnabled(tc.enabled);
+ f.setOffVariation(tc.offVariation);
+ f.setPrerequisitesList(tc.prerequisite);
+
+ const evaluator = new Evaluator();
+ try {
+ const [reason, variation] = evaluator.assignUser(f, user, [], tc.flagVariations);
+ //TODO: check with deep equal ?
+ t.deepEqual(reason, tc.expectedReason);
+ t.deepEqual(variation, tc.expectedVariation);
+ } catch (err) {
+ t.deepEqual(err, tc.expectedError);
+ }
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/assign_user_rule_test.ts b/evaluation/typescript/src/__tests__/evaluator/assign_user_rule_test.ts
new file mode 100644
index 0000000000..8807e7d588
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/assign_user_rule_test.ts
@@ -0,0 +1,13 @@
+import test from 'ava';
+import { createUser } from '../../modelFactory';
+import { newTestFeature } from './evaluate_feature_test';
+import { Evaluator } from '../../evaluation';
+
+test('assign user rule set', (t) => {
+ const user = createUser('user-id', { name: 'user3' });
+ const f = newTestFeature('test-feature');
+ const evalator = new Evaluator();
+ const [reason, variation] = evalator.assignUser(f, user, [], {});
+ t.is(reason.getRuleId(), 'rule-2');
+ t.is(variation.getId(), 'variation-B');
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/assign_user_sampling_seed.ts b/evaluation/typescript/src/__tests__/evaluator/assign_user_sampling_seed.ts
new file mode 100644
index 0000000000..f78d03ecee
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/assign_user_sampling_seed.ts
@@ -0,0 +1,34 @@
+import test from 'ava';
+import { createRolloutStrategy, createStrategy, createUser } from '../../modelFactory';
+import { newTestFeature } from './evaluate_feature_test';
+import { Evaluator } from '../../evaluation';
+import { Reason } from '../../proto/feature/reason_pb';
+import { Strategy } from '../../proto/feature/strategy_pb';
+
+test('assign user with sampling seed', (t) => {
+ const user = createUser('uid', {});
+ const f = newTestFeature('fid');
+ const rolloutStrategy = createRolloutStrategy({
+ variations: [
+ { variation: 'variation-A', weight: 30000 },
+ { variation: 'variation-B', weight: 40000 },
+ { variation: 'variation-C', weight: 30000 },
+ ],
+ });
+ const strategy = createStrategy({
+ rolloutStrategy: rolloutStrategy,
+ type: Strategy.Type.ROLLOUT,
+ });
+ f.setDefaultStrategy(strategy);
+
+ const evalator = new Evaluator();
+ let [reason, variation] = evalator.assignUser(f, user, [], {});
+ t.is(reason.getType(), Reason.Type.DEFAULT);
+ t.is(variation.getId(), 'variation-B'); //rolloutStrategy.getVariationsList()[1].getVariation()
+
+ // Channge sampling seed to change assigned variation.
+ f.setSamplingSeed('test');
+ [reason, variation] = evalator.assignUser(f, user, [], {});
+ t.is(reason.getType(), Reason.Type.DEFAULT);
+ t.is(variation.getId(), 'variation-A'); //rolloutStrategy.getVariationsList()[0].getVariation()
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/assign_user_target_test.ts b/evaluation/typescript/src/__tests__/evaluator/assign_user_target_test.ts
new file mode 100644
index 0000000000..5cc20184cf
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/assign_user_target_test.ts
@@ -0,0 +1,47 @@
+import test from 'ava';
+import { Reason } from '../../proto/feature/reason_pb';
+import { createUser } from '../../modelFactory';
+import { newTestFeature } from './evaluate_feature_test';
+import { Evaluator } from '../../evaluation';
+
+interface TestCase {
+ userID: string;
+ expectedReason: Reason.TypeMap[keyof Reason.TypeMap];
+ expectedVariationID: string;
+}
+
+const TestCases: TestCase[] = [
+ {
+ userID: 'user1',
+ expectedReason: Reason.Type.TARGET,
+ expectedVariationID: 'variation-A',
+ },
+ {
+ userID: 'user2',
+ expectedReason: Reason.Type.TARGET,
+ expectedVariationID: 'variation-B',
+ },
+ {
+ userID: 'user3',
+ expectedReason: Reason.Type.TARGET,
+ expectedVariationID: 'variation-C',
+ },
+ {
+ userID: 'user4',
+ expectedReason: Reason.Type.DEFAULT,
+ expectedVariationID: 'variation-B',
+ },
+];
+
+TestCases.forEach((tc, index) => {
+ test(`Test Case ${index}`, async (t) => {
+ const user = createUser(tc.userID, {});
+ const f = newTestFeature('test-feature');
+
+ const evaluator = new Evaluator();
+ const [reason, variation] = evaluator.assignUser(f, user, [], {});
+ //TODO: check with deep equal ?
+ t.deepEqual(reason.getType(), tc.expectedReason);
+ t.deepEqual(variation.getId(), tc.expectedVariationID);
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/by_evaluated_at_test.ts b/evaluation/typescript/src/__tests__/evaluator/by_evaluated_at_test.ts
new file mode 100644
index 0000000000..66dd50b0a8
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/by_evaluated_at_test.ts
@@ -0,0 +1,611 @@
+import test from 'ava';
+import { Feature } from '../../proto/feature/feature_pb';
+import { Evaluator } from '../../evaluation';
+import { SegmentUser } from '../../proto/feature/segment_pb';
+import { UserEvaluations } from '../../proto/feature/evaluation_pb';
+import { createEvaluation, createPrerequisite, createReason, createUser } from '../../modelFactory';
+import { Reason } from '../../proto/feature/reason_pb';
+import { NewUserEvaluations } from '../../userEvaluation';
+import { newTestFeature } from './evaluate_feature_test';
+
+interface TestCase {
+ desc: string;
+ prevUEID: string;
+ evaluatedAt: number;
+ userAttributesUpdated: boolean;
+ tag: string;
+ createFeatures: () => Feature[];
+ expectedEvals: UserEvaluations;
+ expectedEvalFeatureIDs: string[];
+ expectedError: Error | null;
+}
+
+function TestEvaluateFeaturesByEvaluatedAtCases() {
+ const now = new Date();
+ function getTimeAgo(seconds: number): number {
+ return new Date(now.getTime() - seconds * 1000).getTime() / 1000;
+ }
+
+ const thirtyOneDaysAgo = getTimeAgo(31 * 24 * 60 * 60);
+ const fiveMinutesAgo = getTimeAgo(5 * 60);
+ const tenMinutesAgo = getTimeAgo(10 * 60);
+ const tenMinutesAndNineSecondsAgo = getTimeAgo(609);
+ const tenMinutesAndElevenSecondsAgo = getTimeAgo(611);
+ const oneHourAgo = getTimeAgo(60 * 60);
+
+ const patterns: TestCase[] = [
+ {
+ desc: 'success: evaluate all features since the previous UserEvaluationsID is empty',
+ prevUEID: '',
+ evaluatedAt: thirtyOneDaysAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(fiveMinutesAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(fiveMinutesAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(fiveMinutesAgo);
+ f3.setArchived(true);
+ return [f1, f2, f3];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature2:1:user1',
+ 'feature2',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ ['feature3'],
+ true,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature2'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: evaluate all features since the previous evaluation was over a month ago',
+ prevUEID: 'prevUEID',
+ evaluatedAt: thirtyOneDaysAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(fiveMinutesAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(fiveMinutesAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(fiveMinutesAgo);
+ f3.setArchived(true);
+ return [f1, f2, f3];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature2:1:user1',
+ 'feature2',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ ['feature3'],
+ true,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature2'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: evaluate all features since both feature flags and user attributes have not been updated (although the UEID has been updated)',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature-1');
+ f1.setUpdatedAt(oneHourAgo);
+
+ const f2 = newTestFeature('feature-2');
+ f2.setUpdatedAt(oneHourAgo);
+
+ const f3 = newTestFeature('feature-3');
+ f3.setUpdatedAt(oneHourAgo);
+ f3.setArchived(true);
+ return [f1, f2, f3];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature-1:1:user-1',
+ 'feature-1',
+ 1,
+ 'user-1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature-2:1:user-1',
+ 'feature-2',
+ 1,
+ 'user-1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ ['feature-3'],
+ true,
+ ),
+ expectedEvalFeatureIDs: ['feature-1', 'feature-2'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: evaluate only features updated since the previous evaluations',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(fiveMinutesAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(oneHourAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(fiveMinutesAgo);
+ f3.setArchived(true);
+
+ const f4 = newTestFeature('feature4');
+ f4.setUpdatedAt(oneHourAgo);
+ f4.setArchived(true);
+ return [f1, f2, f3, f4];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ ['feature3'],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: check the adjustment seconds',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(tenMinutesAndNineSecondsAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(tenMinutesAndElevenSecondsAgo);
+ return [f1, f2];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ [],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: evaluate only features has rules when user attributes updated',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: true,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(thirtyOneDaysAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(thirtyOneDaysAgo);
+ f2.setRulesList([]);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(thirtyOneDaysAgo);
+ f3.setArchived(true);
+ return [f1, f2, f3];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ ],
+ [],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: evaluate only the features that have been updated since the previous evaluation, or the features that have rules when user attributes are updated',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: true,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(fiveMinutesAgo);
+ f1.setRulesList([]);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(thirtyOneDaysAgo);
+ f2.setRulesList([]);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(fiveMinutesAgo);
+ f3.setArchived(true);
+
+ const f4 = newTestFeature('feature4');
+ f4.setUpdatedAt(fiveMinutesAgo);
+ f4.setRulesList([]);
+ return [f1, f2, f3, f4];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ createEvaluation(
+ 'feature4:1:user1',
+ 'feature4',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ ],
+ ['feature3'],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature4'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: prerequisite',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(thirtyOneDaysAgo);
+ f1.setPrerequisitesList([createPrerequisite('feature4', 'B')]);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(thirtyOneDaysAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(thirtyOneDaysAgo);
+
+ const f4 = newTestFeature('feature4');
+ f4.setUpdatedAt(fiveMinutesAgo);
+ return [f1, f2, f3, f4];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ createEvaluation(
+ 'feature4:1:user1',
+ 'feature4',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ ],
+ [],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature4'],
+ expectedError: null,
+ },
+ {
+ desc: "success: When a tag is specified, it excludes the evaluations that don't have that tag. But archived features are not excluded",
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: 'tag1',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setTagsList(['tag1']);
+ f1.setUpdatedAt(fiveMinutesAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setTagsList(['tag2']);
+ f2.setUpdatedAt(fiveMinutesAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setTagsList(['tag1']);
+ f3.setArchived(true);
+ f3.setUpdatedAt(fiveMinutesAgo);
+
+ const f4 = newTestFeature('feature4');
+ f4.setTagsList(['tag2']);
+ f4.setArchived(true);
+ f4.setUpdatedAt(fiveMinutesAgo);
+ return [f1, f2, f3, f4];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ ['feature3', 'feature4'],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: When a tag is not specified, it does not exclude evaluations that have tags.',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setTagsList(['tag1']);
+ f1.setUpdatedAt(fiveMinutesAgo);
+
+ const f2 = newTestFeature('feature2');
+ f2.setTagsList(['tag2']);
+ f2.setUpdatedAt(fiveMinutesAgo);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(fiveMinutesAgo);
+
+ const f4 = newTestFeature('feature4');
+ f4.setTagsList(['tag1', 'tag2']);
+ f4.setUpdatedAt(fiveMinutesAgo);
+ return [f1, f2, f3, f4];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature2:1:user1',
+ 'feature2',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature3:1:user1',
+ 'feature3',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ createEvaluation(
+ 'feature4:1:user1',
+ 'feature4',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.DEFAULT),
+ ),
+ ],
+ [],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature2', 'feature3', 'feature4'],
+ expectedError: null,
+ },
+ {
+ desc: 'success: including up/downwards features of target feature with prerequisite',
+ prevUEID: 'prevUEID',
+ evaluatedAt: tenMinutesAgo,
+ userAttributesUpdated: false,
+ tag: '',
+ createFeatures: () => {
+ const f1 = newTestFeature('feature1');
+ f1.setUpdatedAt(oneHourAgo);
+ f1.setPrerequisitesList([createPrerequisite('feature2', 'B')]);
+
+ const f2 = newTestFeature('feature2');
+ f2.setUpdatedAt(fiveMinutesAgo);
+ f2.setPrerequisitesList([createPrerequisite('feature3', 'B')]);
+
+ const f3 = newTestFeature('feature3');
+ f3.setUpdatedAt(oneHourAgo);
+ return [f1, f2, f3];
+ },
+ expectedEvals: NewUserEvaluations(
+ 'dummy',
+ [
+ createEvaluation(
+ 'feature1:1:user1',
+ 'feature1',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ createEvaluation(
+ 'feature2:1:user1',
+ 'feature2',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ createEvaluation(
+ 'feature3:1:user1',
+ 'feature3',
+ 1,
+ 'user1',
+ 'variation-B',
+ 'B',
+ 'Variation B',
+ createReason('', Reason.Type.RULE),
+ ),
+ ],
+ [],
+ false,
+ ),
+ expectedEvalFeatureIDs: ['feature1', 'feature2', 'feature3'],
+ expectedError: null,
+ },
+ ];
+ return patterns;
+}
+
+TestEvaluateFeaturesByEvaluatedAtCases().forEach((p) => {
+ test(p.desc, async (t) => {
+ const user = createUser('user-1', {});
+ const segmentUser: Map = new Map();
+ const evaluator = new Evaluator();
+ try {
+ const actual = evaluator.evaluateFeaturesByEvaluatedAt(
+ p.createFeatures(),
+ user,
+ segmentUser,
+ p.prevUEID,
+ p.evaluatedAt,
+ p.userAttributesUpdated,
+ p.tag,
+ );
+
+ t.deepEqual(p.expectedEvals.getForceUpdate(), actual.getForceUpdate());
+ t.deepEqual(p.expectedEvals.getArchivedFeatureIdsList(), actual.getArchivedFeatureIdsList());
+ t.is(p.expectedEvals.getEvaluationsList().length, actual.getEvaluationsList().length);
+ actual.getEvaluationsList().forEach((e) => {
+ t.true(p.expectedEvalFeatureIDs.includes(e.getFeatureId()));
+ });
+ //TODO: Check me - did Golang test is missing this
+ //t.deepEqual(p.expectedEvals.toObject(), actual.toObject());
+ } catch (error) {
+ t.deepEqual(p.expectedError, error);
+ }
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/evaluate_feature_test.ts b/evaluation/typescript/src/__tests__/evaluator/evaluate_feature_test.ts
new file mode 100644
index 0000000000..3034d24834
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/evaluate_feature_test.ts
@@ -0,0 +1,219 @@
+import test from 'ava';
+import { Feature } from '../../proto/feature/feature_pb';
+import { EvaluationID, Evaluator } from '../../evaluation';
+import { SegmentUser } from '../../proto/feature/segment_pb';
+import { Evaluation } from '../../proto/feature/evaluation_pb';
+import { createPrerequisite, createVariation, createFeature, createUser } from '../../modelFactory';
+import { Strategy } from '../../proto/feature/strategy_pb';
+import { Clause } from '../../proto/feature/clause_pb';
+import { Reason } from '../../proto/feature/reason_pb';
+
+const ErrVariationNotFound = new Error('evaluator: variation not found');
+
+const TestFeatureIDs = {
+ fID0: 'fID0',
+ fID1: 'fID1',
+ fID2: 'fID2',
+};
+
+export const TestVariations = {
+ variationA: createVariation('variation-A', 'A', 'Variation A', 'Thing does A'),
+ variationB: createVariation('variation-B', 'B', 'Variation B', 'Thing does B'),
+ variationC: createVariation('variation-C', 'C', 'Variation C', 'Thing does C'),
+};
+
+export function newTestFeature(id: string): Feature {
+ // Variations
+ const variations = [
+ TestVariations.variationA.toObject(),
+ TestVariations.variationB.toObject(),
+ TestVariations.variationC.toObject(),
+ ];
+
+ // Targets
+ const targets = [
+ { variation: 'variation-A', users: ['user1'] },
+ { variation: 'variation-B', users: ['user2'] },
+ { variation: 'variation-C', users: ['user3'] },
+ ];
+
+ // Rules
+ const rules = [
+ {
+ id: 'rule-1',
+ attribute: 'name',
+ operator: Clause.Operator.EQUALS,
+ values: ['user1', 'user2'],
+ fixedVariation: 'variation-A',
+ },
+ {
+ id: 'rule-2',
+ attribute: 'name',
+ operator: Clause.Operator.EQUALS,
+ values: ['user3', 'user4'],
+ fixedVariation: 'variation-B',
+ },
+ ];
+
+ // Default Strategy
+ const defaultStrategy = {
+ type: Strategy.Type.FIXED,
+ variation: 'variation-B',
+ };
+
+ // Call the second function to create and return the Feature
+ return createFeature({
+ id: id,
+ name: 'test feature',
+ version: 1,
+ enabled: true,
+ createdAt: Date.now(),
+ variationType: Feature.VariationType.STRING,
+ variations: variations,
+ targets: targets,
+ rules: rules,
+ defaultStrategy: defaultStrategy,
+ prerequisitesList: [],
+ });
+}
+
+const findEvaluation = (evaluations: Evaluation[], featureId: string): Evaluation | null => {
+ return evaluations.find((e) => e.getFeatureId() === featureId) || null;
+};
+
+test('EvaluateFeature', async (t) => {
+ const f = newTestFeature(TestFeatureIDs.fID0);
+ f.getTagsList().push('tag1');
+
+ const f1 = newTestFeature(TestFeatureIDs.fID1);
+ f1.getTagsList().push('tag1');
+ f1.setEnabled(false);
+ f1.setOffVariation(TestVariations.variationA.getId());
+
+ const f2 = newTestFeature(TestFeatureIDs.fID2);
+ f2.getTagsList().push('tag1');
+
+ const patterns = [
+ {
+ enabled: false,
+ offVariation: 'notfound',
+ userID: 'uID0',
+ prerequisite: [],
+ expected: null,
+ expectedError: ErrVariationNotFound,
+ },
+ {
+ enabled: false,
+ offVariation: 'variation-A',
+ userID: 'uID0',
+ prerequisite: [],
+ expected: {
+ featureId: 'fID0',
+ featureVersion: 1,
+ id: EvaluationID(f.getId(), f.getVersion(), 'uID0'),
+ userId: 'uID0',
+ variationId: 'variation-A',
+ variationName: 'Variation A',
+ variationValue: 'A',
+ variation: { id: 'variation-A', name: 'Variation A', value: 'A', description: '' },
+ reason: { ruleId: '', type: Reason.Type.OFF_VARIATION },
+ },
+ expectedError: null,
+ },
+ {
+ enabled: false,
+ offVariation: '',
+ userID: 'uID0',
+ prerequisite: [],
+ expected: {
+ id: EvaluationID(f.getId(), f.getVersion(), 'uID0'),
+ featureId: 'fID0',
+ featureVersion: 1,
+ userId: 'uID0',
+ variationId: 'variation-B',
+ variationName: 'Variation B',
+ variationValue: 'B',
+ variation: { id: 'variation-B', name: 'Variation B', value: 'B', description: '' },
+ reason: { ruleId: '', type: Reason.Type.DEFAULT },
+ },
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: '',
+ userID: 'uID2',
+ prerequisite: [],
+ expected: {
+ id: EvaluationID(f.getId(), f.getVersion(), 'uID2'),
+ featureId: 'fID0',
+ featureVersion: 1,
+ userId: 'uID2',
+ variationId: 'variation-B',
+ variationName: 'Variation B',
+ variationValue: 'B',
+ variation: { id: 'variation-B', name: 'Variation B', value: 'B', description: '' },
+ reason: { ruleId: '', type: Reason.Type.DEFAULT },
+ },
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: 'variation-A',
+ userID: 'uID2',
+ prerequisite: [createPrerequisite(f1.getId(), TestVariations.variationB.getId())],
+ expected: {
+ id: EvaluationID(f.getId(), f.getVersion(), 'uID2'),
+ featureId: 'fID0',
+ featureVersion: 1,
+ userId: 'uID2',
+ variationId: 'variation-A',
+ variationName: 'Variation A',
+ variationValue: 'A',
+ variation: { id: 'variation-A', name: 'Variation A', value: 'A', description: '' },
+ reason: { ruleId: '', type: Reason.Type.PREREQUISITE },
+ },
+ expectedError: null,
+ },
+ {
+ enabled: true,
+ offVariation: '',
+ userID: 'uID2',
+ prerequisite: [createPrerequisite(f2.getId(), TestVariations.variationA.getId())],
+ expected: {
+ id: EvaluationID(f.getId(), f.getVersion(), 'uID2'),
+ featureId: 'fID0',
+ featureVersion: 1,
+ userId: 'uID2',
+ variationId: 'variation-B',
+ variationName: 'Variation B',
+ variationValue: 'B',
+ variation: { id: 'variation-B', name: 'Variation B', value: 'B', description: '' },
+ reason: { ruleId: '', type: Reason.Type.DEFAULT },
+ },
+ expectedError: null,
+ },
+ ];
+
+ for (const p of patterns) {
+ const evaluator = new Evaluator();
+ const user = createUser(p.userID, {});
+ f.setEnabled(p.enabled);
+ f.setOffVariation(p.offVariation);
+ f.setPrerequisitesList(p.prerequisite);
+
+ const segmentUser: Map = new Map();
+ try {
+ const evaluation = await evaluator.evaluateFeatures([f, f1, f2], user, segmentUser, 'tag1');
+ if (evaluation.getEvaluationsList()) {
+ const actual = findEvaluation(evaluation.getEvaluationsList(), f.getId());
+ t.deepEqual(p.expected, actual?.toObject());
+ }
+ } catch (error) {
+ if (error instanceof Error || error === null) {
+ t.deepEqual(p.expectedError, error);
+ } else {
+ t.fail(`Unexpected error type: ${typeof error}: ${error}`);
+ }
+ }
+ }
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/get_eval_features_test.ts b/evaluation/typescript/src/__tests__/evaluator/get_eval_features_test.ts
new file mode 100644
index 0000000000..c90609e15c
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/get_eval_features_test.ts
@@ -0,0 +1,194 @@
+import test from 'ava';
+import { createPrerequisite, createFeature } from '../../modelFactory';
+import { Feature } from '../../proto/feature/feature_pb';
+import { Evaluator } from '../../evaluation';
+
+interface TestCase {
+ desc: string;
+ targets: Feature[];
+ all: Feature[];
+ expectedIDs: string[];
+}
+
+const patterns: TestCase[] = [
+ {
+ desc: 'success: No prerequisites',
+ targets: [
+ createFeature({
+ id: 'featureA',
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ }),
+ createFeature({
+ id: 'featureB',
+ }),
+ ],
+ expectedIDs: ['featureA'],
+ },
+ {
+ desc: 'success: one feature depends on target',
+ targets: [
+ createFeature({
+ id: 'featureA',
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ }),
+ createFeature({
+ id: 'featureB',
+ prerequisitesList: [createPrerequisite('featureA', '')],
+ }),
+ createFeature({
+ id: 'featureC',
+ }),
+ ],
+ expectedIDs: ['featureA', 'featureB'],
+ },
+ {
+ desc: 'success: multiple features depends on target',
+ targets: [
+ createFeature({
+ id: 'featureA',
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ }),
+ createFeature({
+ id: 'featureB',
+ prerequisitesList: [createPrerequisite('featureA', '')],
+ }),
+ createFeature({
+ id: 'featureC',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ createFeature({
+ id: 'featureD',
+ prerequisitesList: [createPrerequisite('featureA', '')],
+ }),
+ createFeature({
+ id: 'featureE',
+ }),
+ ],
+ expectedIDs: ['featureA', 'featureB', 'featureC', 'featureD'],
+ },
+ {
+ desc: 'success: target depends on one feature',
+ targets: [
+ createFeature({
+ id: 'featureA',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ createFeature({
+ id: 'featureB',
+ }),
+ createFeature({
+ id: 'featureC',
+ }),
+ ],
+ expectedIDs: ['featureA', 'featureB'],
+ },
+ {
+ desc: 'success: target depends on multiple features',
+ targets: [
+ createFeature({
+ id: 'featureA',
+ prerequisitesList: [createPrerequisite('featureB', ''), createPrerequisite('featureC', '')],
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ createFeature({
+ id: 'featureB',
+ prerequisitesList: [createPrerequisite('featureD', '')],
+ }),
+ createFeature({
+ id: 'featureC',
+ }),
+ createFeature({
+ id: 'featureD',
+ }),
+ createFeature({
+ id: 'featureE',
+ }),
+ ],
+ // order is different with golang test but the result is same
+ expectedIDs: ['featureA', 'featureB', 'featureD', 'featureC'],
+ },
+ {
+ desc: 'success: complex pattern 1',
+ targets: [
+ createFeature({
+ id: 'featureD',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ ],
+ all: [
+ createFeature({
+ id: 'featureA',
+ }),
+ createFeature({
+ id: 'featureB',
+ prerequisitesList: [createPrerequisite('featureA', '')],
+ }),
+ createFeature({
+ id: 'featureC',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ createFeature({
+ id: 'featureD',
+ prerequisitesList: [createPrerequisite('featureB', '')],
+ }),
+ createFeature({
+ id: 'featureE',
+ prerequisitesList: [createPrerequisite('featureC', ''), createPrerequisite('featureD', '')],
+ }),
+ createFeature({
+ id: 'featureF',
+ prerequisitesList: [createPrerequisite('featureE', '')],
+ }),
+ createFeature({
+ id: 'featureG',
+ prerequisitesList: [createPrerequisite('featureA', '')],
+ }),
+ createFeature({
+ id: 'featureH',
+ }),
+ ],
+ // order is different with golang test but the result is same
+ expectedIDs: ['featureD', 'featureB', 'featureA', 'featureE', 'featureF'],
+ },
+];
+
+patterns.forEach(({ desc, targets, all, expectedIDs }) => {
+ test(desc, (t) => {
+ // Test code
+ try {
+ const evalator = new Evaluator();
+ const actual = evalator.getEvalFeatures(targets, all);
+ t.deepEqual(
+ actual.map((e) => {
+ return e.getId();
+ }),
+ expectedIDs,
+ );
+ } catch (error) {
+ t.fail(`Error: ${error}`);
+ }
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/evaluator/get_prerequisite_downwards.ts b/evaluation/typescript/src/__tests__/evaluator/get_prerequisite_downwards.ts
new file mode 100644
index 0000000000..4d152df22c
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/evaluator/get_prerequisite_downwards.ts
@@ -0,0 +1,166 @@
+import test from 'ava';
+import { createPrerequisite, createFeature } from '../../modelFactory';
+import { Evaluator } from '../../evaluation';
+
+/*
+graph TD;
+ featureA["Feature A"] --> featureE["Feature E"];
+ featureA --> featureF["Feature F"];
+
+ featureC["Feature C"] --> featureL["Feature L"];
+
+ featureE --> featureG["Feature G"];
+
+ featureG["Feature G"] --> featureH["Feature H"];
+
+ featureH --> featureI["Feature I"];
+ featureH --> featureJ["Feature J"];
+
+ featureI["Feature I"] --> featureK["Feature K"];
+
+ featureL --> featureM["Feature M"];
+ featureL --> featureN["Feature N"];
+
+ featureB["Feature B"] --- NoPrerequisite;
+ featureD["Feature D"] --- NoPrerequisite;
+ featureF --- NoPrerequisite;
+ featureJ --- NoPrerequisite;
+ featureK --- NoPrerequisite;
+ featureM --- NoPrerequisite;
+ featureN --- NoPrerequisite;
+*/
+var allFeaturesForPrerequisiteTest = {
+ featureA: createFeature({
+ id: 'featureA',
+ name: 'featureA',
+ prerequisitesList: [createPrerequisite('featureE', ''), createPrerequisite('featureF', '')],
+ }),
+ featureB: createFeature({
+ id: 'featureB',
+ name: 'featureB',
+ prerequisitesList: [],
+ }),
+ featureC: createFeature({
+ id: 'featureC',
+ name: 'featureC',
+ prerequisitesList: [createPrerequisite('featureL', '')],
+ }),
+ featureD: createFeature({
+ id: 'featureD',
+ name: 'featureD',
+ prerequisitesList: [],
+ }),
+ featureE: createFeature({
+ id: 'featureE',
+ name: 'featureE',
+ prerequisitesList: [createPrerequisite('featureG', '')],
+ }),
+ featureF: createFeature({
+ id: 'featureF',
+ name: 'featureF',
+ prerequisitesList: [],
+ }),
+ featureG: createFeature({
+ id: 'featureG',
+ name: 'featureG',
+ prerequisitesList: [createPrerequisite('featureH', '')],
+ }),
+ featureH: createFeature({
+ id: 'featureH',
+ name: 'featureH',
+ prerequisitesList: [createPrerequisite('featureI', ''), createPrerequisite('featureJ', '')],
+ }),
+ featureI: createFeature({
+ id: 'featureI',
+ name: 'featureI',
+ prerequisitesList: [createPrerequisite('featureK', '')],
+ }),
+ featureJ: createFeature({
+ id: 'featureJ',
+ name: 'featureJ',
+ prerequisitesList: [],
+ }),
+ featureK: createFeature({
+ id: 'featureK',
+ name: 'featureK',
+ prerequisitesList: [],
+ }),
+ featureL: createFeature({
+ id: 'featureL',
+ name: 'featureL',
+ prerequisitesList: [createPrerequisite('featureM', ''), createPrerequisite('featureN', '')],
+ }),
+ featureM: createFeature({
+ id: 'featureM',
+ name: 'featureM',
+ prerequisitesList: [],
+ }),
+ featureN: createFeature({
+ id: 'featureN',
+ name: 'featureN',
+ prerequisitesList: [],
+ }),
+};
+
+// The order of the output is a bit diffence with golang test, but the result is the same
+const TestCases = [
+ {
+ desc: 'success: No prerequisites',
+ target: [allFeaturesForPrerequisiteTest.featureB, allFeaturesForPrerequisiteTest.featureD],
+ expected: [allFeaturesForPrerequisiteTest.featureB, allFeaturesForPrerequisiteTest.featureD],
+ expectedErr: null,
+ },
+ {
+ desc: 'success: Get prerequisites pattern1',
+ target: [allFeaturesForPrerequisiteTest.featureA],
+ expected: [
+ allFeaturesForPrerequisiteTest.featureA,
+ allFeaturesForPrerequisiteTest.featureE,
+ allFeaturesForPrerequisiteTest.featureG,
+ allFeaturesForPrerequisiteTest.featureH,
+ allFeaturesForPrerequisiteTest.featureI,
+ allFeaturesForPrerequisiteTest.featureK,
+ allFeaturesForPrerequisiteTest.featureJ,
+ allFeaturesForPrerequisiteTest.featureF,
+ ],
+ expectedErr: null,
+ },
+ {
+ desc: 'success: Get prerequisites pattern2',
+ target: [allFeaturesForPrerequisiteTest.featureC, allFeaturesForPrerequisiteTest.featureD],
+ expected: [
+ allFeaturesForPrerequisiteTest.featureC,
+ allFeaturesForPrerequisiteTest.featureL,
+ allFeaturesForPrerequisiteTest.featureM,
+ allFeaturesForPrerequisiteTest.featureN,
+ allFeaturesForPrerequisiteTest.featureD,
+ ],
+ expectedErr: null,
+ },
+ {
+ desc: 'success: Get prerequisites pattern3',
+ target: [allFeaturesForPrerequisiteTest.featureD, allFeaturesForPrerequisiteTest.featureH],
+ expected: [
+ allFeaturesForPrerequisiteTest.featureD,
+ allFeaturesForPrerequisiteTest.featureH,
+ allFeaturesForPrerequisiteTest.featureI,
+ allFeaturesForPrerequisiteTest.featureK,
+ allFeaturesForPrerequisiteTest.featureJ,
+ ],
+ expectedErr: null,
+ },
+];
+
+const allFeatures = Object.values(allFeaturesForPrerequisiteTest);
+
+TestCases.forEach(({ desc, target, expected, expectedErr }) => {
+ test(desc, async (t) => {
+ try {
+ const evalator = new Evaluator();
+ const actual = evalator.getPrerequisiteDownwards(target, allFeatures);
+ t.deepEqual(actual, expected);
+ } catch (error) {
+ t.deepEqual(error, expectedErr);
+ }
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/rule_evaluator_test.ts b/evaluation/typescript/src/__tests__/rule_evaluator_test.ts
new file mode 100644
index 0000000000..608a0df64c
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/rule_evaluator_test.ts
@@ -0,0 +1,146 @@
+import test from 'ava';
+import { Rule } from '../proto/feature/rule_pb';
+import { Feature } from '../proto/feature/feature_pb';
+import { FixedStrategy, Strategy } from '../proto/feature/strategy_pb';
+import { Clause } from '../proto/feature/clause_pb';
+import { RuleEvaluator } from '../ruleEvaluator';
+import { User } from '../proto/user/user_pb';
+import { SegmentUser } from '../proto/feature/segment_pb';
+import { createRule, createSegmentUser, createUser, createVariation } from '../modelFactory';
+
+// Define the type for the test cases
+interface TestCase {
+ user: User;
+ expected: Rule | null;
+ description: string;
+}
+
+const TestRuleList = {
+ EQUALS: createRule(
+ 'rule-id-1',
+ 'full-name',
+ Clause.Operator.EQUALS,
+ ['bucketeer project'],
+ 'variation-A',
+ ),
+ STARTS_WITH: createRule(
+ 'rule-id-2',
+ 'first-name',
+ Clause.Operator.STARTS_WITH,
+ ['buck'],
+ 'variation-A',
+ ),
+ ENDS_WITH: createRule(
+ 'rule-id-3',
+ 'last-name',
+ Clause.Operator.ENDS_WITH,
+ ['ject'],
+ 'variation-A',
+ ),
+ SEGMENT: createRule(
+ 'rule-id-4',
+ '',
+ Clause.Operator.SEGMENT,
+ ['segment-id-1', 'segment-id-2'],
+ 'variation-B',
+ ),
+ IN: createRule('rule-id-5', 'email', Clause.Operator.IN, ['bucketeer@gmail.com'], 'variation-B'),
+};
+
+function newTestFeature(): Feature {
+ const feature = new Feature();
+ feature.setId('feature-id');
+ feature.setName('test feature');
+ feature.setVersion(1);
+ feature.setCreatedAt(Math.floor(Date.now() / 1000)); // Unix timestamp in seconds
+
+ const variations = [
+ createVariation('variation-A', 'A', 'Variation A', 'Thing does A'),
+ createVariation('variation-B', 'B', 'Variation B', 'Thing does B'),
+ ];
+ feature.setVariationsList(variations);
+ const rules = [
+ TestRuleList.EQUALS,
+ TestRuleList.STARTS_WITH,
+ TestRuleList.ENDS_WITH,
+ TestRuleList.SEGMENT,
+ TestRuleList.IN,
+ ];
+
+ feature.setRulesList(rules);
+
+ const fixedStrategy = new FixedStrategy();
+ fixedStrategy.setVariation('variation-B');
+ const strategy = new Strategy();
+ strategy.setType(Strategy.Type.FIXED);
+ strategy.setFixedStrategy(fixedStrategy);
+
+ feature.setDefaultStrategy(strategy);
+
+ return feature;
+}
+
+function newSegmentUserIDs(): SegmentUser[] {
+ return [
+ createSegmentUser('user-id-1', 'segment-id-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('user-id-1', 'segment-id-2', SegmentUser.State.INCLUDED),
+ createSegmentUser('user-id-2', 'segment-id-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('user-id-2', 'segment-id-2', SegmentUser.State.INCLUDED),
+ createSegmentUser('user-id-3', 'segment-id-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('user-id-4', 'segment-id-2', SegmentUser.State.INCLUDED),
+ ];
+}
+
+// Define test cases
+const testcases: TestCase[] = [
+ {
+ user: createUser('user-id-1', { 'full-name': 'bucketeer project' }),
+ expected: TestRuleList.EQUALS,
+ description: 'TestRuleList.EQUALS',
+ },
+ {
+ user: createUser('user-id-1', { 'first-name': 'bucketeer' }),
+ expected: TestRuleList.STARTS_WITH,
+ description: 'TestRuleList.STARTS_WITH',
+ },
+ {
+ user: createUser('user-id-1', { 'last-name': 'project' }),
+ expected: TestRuleList.ENDS_WITH,
+ description: 'TestRuleList.ENDS_WITH',
+ },
+ {
+ user: createUser('user-id-3', { email: 'bucketeer@gmail.com' }),
+ expected: TestRuleList.IN,
+ description: 'TestRuleList.IN',
+ },
+ {
+ user: createUser('user-id-1', null),
+ expected: TestRuleList.SEGMENT,
+ description: 'TestRuleList.SEGMENT - user-id-1',
+ },
+ {
+ user: createUser('user-id-2', null),
+ expected: TestRuleList.SEGMENT,
+ description: 'TestRuleList.SEGMENT - user-id-2',
+ },
+ {
+ user: createUser('user-id-3', null),
+ expected: null,
+ description: 'No rule matched - user-id-3',
+ },
+ {
+ user: createUser('user-id-4', null),
+ expected: null,
+ description: 'No rule matched - user-id-4',
+ },
+];
+
+// Test cases
+testcases.forEach(({ user, expected, description }) => {
+ test(description, (t) => {
+ const ruleEvaluator = new RuleEvaluator();
+ const values = newSegmentUserIDs();
+ const actual = ruleEvaluator.evaluate(newTestFeature().getRulesList(), user, values, {});
+ t.deepEqual(actual, expected);
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/segment_evaluator_test.ts b/evaluation/typescript/src/__tests__/segment_evaluator_test.ts
new file mode 100644
index 0000000000..daf6d22a9c
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/segment_evaluator_test.ts
@@ -0,0 +1,148 @@
+import test from 'ava';
+import { SegmentUser } from '../proto/feature/segment_pb';
+import { SegmentEvaluator } from '../segmentEvaluator';
+
+// Define the type for the test cases
+interface SegmentEvaluatorTestCase {
+ desc: string;
+ segmentIDs: string[];
+ userID: string;
+ segmentUsers: SegmentUser[];
+ expected: boolean;
+}
+
+export const SegmentEvaluatorTestCases: SegmentEvaluatorTestCase[] = [
+ {
+ desc: 'user is included in all segments',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.INCLUDED),
+ ],
+ expected: true,
+ },
+ {
+ desc: 'user is excluded in one segment',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.EXCLUDED),
+ ],
+ expected: false,
+ },
+ {
+ desc: 'user does not exist in any segments',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-2', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-2', SegmentUser.State.INCLUDED),
+ ],
+ expected: false,
+ },
+ {
+ desc: 'empty segment IDs',
+ segmentIDs: [],
+ userID: 'user-1',
+ segmentUsers: [createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED)],
+ expected: true, // No segments to evaluate means always true
+ },
+ {
+ desc: 'single segment ID, user included',
+ segmentIDs: ['segment-1'],
+ userID: 'user-1',
+ segmentUsers: [createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED)],
+ expected: true,
+ },
+ {
+ desc: 'single segment ID, user excluded',
+ segmentIDs: ['segment-1'],
+ userID: 'user-1',
+ segmentUsers: [createSegmentUser('segment-1', 'user-1', SegmentUser.State.EXCLUDED)],
+ expected: false,
+ },
+ {
+ desc: 'multiple segment IDs with mixed states',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.INCLUDED),
+ ],
+ expected: true,
+ },
+ {
+ desc: 'multiple segment IDs, only one excluded',
+ segmentIDs: ['segment-1', 'segment-2', 'segment-3'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.EXCLUDED),
+ createSegmentUser('segment-3', 'user-1', SegmentUser.State.INCLUDED),
+ ],
+ expected: false,
+ },
+ {
+ desc: 'user included in segments, but not all segments defined',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-3', 'user-1', SegmentUser.State.INCLUDED), // segment-3 is not in the IDs
+ ],
+ expected: false,
+ },
+ {
+ desc: 'user included in all segments but one',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.EXCLUDED), // Excluded in segment-2
+ ],
+ expected: false,
+ },
+ {
+ desc: 'multiple users with mixed states across segments',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-2',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-1', 'user-2', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-2', SegmentUser.State.INCLUDED),
+ ],
+ expected: true,
+ },
+ {
+ desc: 'user present in segments but marked as deleted',
+ segmentIDs: ['segment-1', 'segment-2'],
+ userID: 'user-1',
+ segmentUsers: [
+ createSegmentUser('segment-1', 'user-1', SegmentUser.State.INCLUDED),
+ createSegmentUser('segment-2', 'user-1', SegmentUser.State.EXCLUDED),
+ ],
+ expected: false, // The user is excluded in segment-2
+ },
+];
+
+function createSegmentUser(
+ segmentId: string,
+ userId: string,
+ state: SegmentUser.StateMap[keyof SegmentUser.StateMap],
+): SegmentUser {
+ const user = new SegmentUser();
+ user.setSegmentId(segmentId);
+ user.setUserId(userId);
+ user.setState(state);
+ return user;
+}
+
+SegmentEvaluatorTestCases.forEach(({ desc, segmentIDs, userID, segmentUsers, expected }) => {
+ test(desc, (t) => {
+ const evaluator = new SegmentEvaluator();
+ const actual = evaluator.evaluate(segmentIDs, userID, segmentUsers);
+ t.is(actual, expected);
+ });
+});
diff --git a/evaluation/typescript/src/__tests__/user_evaluation_test.ts b/evaluation/typescript/src/__tests__/user_evaluation_test.ts
new file mode 100644
index 0000000000..df02cbbbe5
--- /dev/null
+++ b/evaluation/typescript/src/__tests__/user_evaluation_test.ts
@@ -0,0 +1,151 @@
+import test from 'ava';
+import * as userEvaluation from '../userEvaluation';
+import { Evaluation } from '../proto/feature/evaluation_pb';
+import { GenerateFeaturesID, sortMapKeys } from '../userEvaluation';
+import { Feature } from '../proto/feature/feature_pb';
+
+// Helper function to create an Evaluation object
+function NewEvaluation(id: string): Evaluation {
+ const evaluation = new Evaluation();
+ evaluation.setId(id);
+ return evaluation;
+}
+
+// Helper function to create a Feature object
+function NewFeature(id: string, version: number): Feature {
+ const feature = new Feature();
+ feature.setId(id);
+ feature.setVersion(version);
+ return feature;
+}
+
+// Define the interface for the test case
+type NewUserEvaluationsTestCase = {
+ id: string;
+ evaluations: Evaluation[];
+ archivedFeaturesIds: string[];
+ forceUpdate: boolean;
+ expected: {
+ id: string;
+ evaluations: Evaluation[];
+ archivedFeaturesIds: string[];
+ forceUpdate: boolean;
+ };
+};
+
+// Test cases pattern similar to the Go version
+const NewUserEvaluationsTestCases: NewUserEvaluationsTestCase[] = [
+ {
+ id: '1234',
+ evaluations: [NewEvaluation('test-id1')],
+ archivedFeaturesIds: ['test-id2'],
+ forceUpdate: false,
+ expected: {
+ id: '1234',
+ evaluations: [NewEvaluation('test-id1')],
+ archivedFeaturesIds: ['test-id2'],
+ forceUpdate: false,
+ },
+ },
+ {
+ id: '5678',
+ evaluations: [NewEvaluation('test-id3')],
+ archivedFeaturesIds: [],
+ forceUpdate: true,
+ expected: {
+ id: '5678',
+ evaluations: [NewEvaluation('test-id3')],
+ archivedFeaturesIds: [],
+ forceUpdate: true,
+ },
+ },
+];
+
+// Iterate over each test case
+NewUserEvaluationsTestCases.forEach(
+ ({ id, evaluations, archivedFeaturesIds, forceUpdate, expected }) => {
+ test(`NewUserEvaluations - ${id}`, (t) => {
+ const actual = userEvaluation.NewUserEvaluations(
+ id,
+ evaluations,
+ archivedFeaturesIds,
+ forceUpdate,
+ );
+
+ t.is(actual.getId(), expected.id);
+ t.deepEqual(actual.getEvaluationsList(), expected.evaluations);
+ t.deepEqual(actual.getArchivedFeatureIdsList(), expected.archivedFeaturesIds);
+ t.is(actual.getForceUpdate(), expected.forceUpdate);
+ t.truthy(actual.getCreatedAt()); // Check if CreatedAt is set, similar to NotZero in Go
+ //TODO: Check me - did Golang test is missing this
+ //t.deepEqual(actual.toObject(), expected);
+ });
+ },
+);
+
+// Test cases similar to the Go version
+type SortMapKeysTestCase = {
+ input: { [key: string]: string } | null;
+ expected: string[];
+ desc: string;
+};
+
+const SortMapTestCases: SortMapKeysTestCase[] = [
+ {
+ input: null,
+ expected: [],
+ desc: 'nil',
+ },
+ {
+ input: {},
+ expected: [],
+ desc: 'empty',
+ },
+ {
+ input: { b: 'value-b', c: 'value-c', a: 'value-a', d: 'value-d' },
+ expected: ['a', 'b', 'c', 'd'],
+ desc: 'success',
+ },
+];
+
+// Run each test case
+SortMapTestCases.forEach(({ input, expected, desc }) => {
+ test(`sortMapKeys - ${desc}`, (t) => {
+ const actual = sortMapKeys(input ?? {});
+ t.deepEqual(actual, expected, desc);
+ });
+});
+
+// Define test case structure
+type GenerateFeaturesIDTestCase = {
+ desc: string;
+ input: Feature[] | null;
+ expected: string;
+};
+
+// Define the test cases
+const GenerateFeaturesIDTestCases: GenerateFeaturesIDTestCase[] = [
+ {
+ desc: 'nil',
+ input: null,
+ expected: '14695981039346656037',
+ },
+ {
+ desc: 'success: single',
+ input: [NewFeature('id-1', 1)],
+ expected: '5476413260388599211', // Example expected value
+ },
+ {
+ desc: 'success: multiple',
+ input: [NewFeature('id-1', 1), NewFeature('id-2', 2)],
+ expected: '17283374094628184689', // Example expected value
+ },
+];
+
+// Run each test case
+GenerateFeaturesIDTestCases.forEach(({ desc, input, expected }) => {
+ test(`GenerateFeaturesID - ${desc}`, (t) => {
+ const actual = GenerateFeaturesID(input ?? []);
+ t.is(actual, expected, desc);
+ });
+});
diff --git a/evaluation/typescript/src/clauseEvaluator.ts b/evaluation/typescript/src/clauseEvaluator.ts
new file mode 100644
index 0000000000..b06be1885b
--- /dev/null
+++ b/evaluation/typescript/src/clauseEvaluator.ts
@@ -0,0 +1,233 @@
+import { Clause } from './proto/feature/clause_pb';
+import { SegmentUser } from './proto/feature/segment_pb';
+import { SegmentEvaluator } from './segmentEvaluator';
+import { DependencyEvaluator } from './dependencyEvaluator';
+import * as semver from 'semver';
+//
+class ClauseEvaluator {
+ private segmentEvaluator: SegmentEvaluator;
+ private dependencyEvaluator: DependencyEvaluator;
+
+ constructor() {
+ this.segmentEvaluator = new SegmentEvaluator();
+ this.dependencyEvaluator = new DependencyEvaluator();
+ }
+
+ evaluate(
+ targetValue: string,
+ clause: Clause,
+ userID: string,
+ segmentUsers: SegmentUser[],
+ flagVariations: { [key: string]: string },
+ ): boolean {
+ try {
+ switch (clause.getOperator()) {
+ case Clause.Operator.EQUALS:
+ return this.equals(targetValue, clause.getValuesList());
+ case Clause.Operator.IN:
+ return this.in(targetValue, clause.getValuesList());
+ case Clause.Operator.STARTS_WITH:
+ return this.startsWith(targetValue, clause.getValuesList());
+ case Clause.Operator.ENDS_WITH:
+ return this.endsWith(targetValue, clause.getValuesList());
+ case Clause.Operator.SEGMENT:
+ return this.segmentEvaluator.evaluate(clause.getValuesList(), userID, segmentUsers);
+ case Clause.Operator.GREATER:
+ return this.greater(targetValue, clause.getValuesList());
+ case Clause.Operator.GREATER_OR_EQUAL:
+ return this.greaterOrEqual(targetValue, clause.getValuesList());
+ case Clause.Operator.LESS:
+ return this.less(targetValue, clause.getValuesList());
+ case Clause.Operator.LESS_OR_EQUAL:
+ return this.lessOrEqual(targetValue, clause.getValuesList());
+ case Clause.Operator.BEFORE:
+ return this.before(targetValue, clause.getValuesList());
+ case Clause.Operator.AFTER:
+ return this.after(targetValue, clause.getValuesList());
+ case Clause.Operator.FEATURE_FLAG:
+ return this.dependencyEvaluator.evaluate(
+ clause.getAttribute(),
+ clause.getValuesList(),
+ flagVariations,
+ );
+ case Clause.Operator.PARTIALLY_MATCH:
+ return this.partiallyMatches(targetValue, clause.getValuesList());
+ default:
+ return false;
+ }
+ } catch (error) {
+ console.error('Error evaluating clause:', error);
+ throw error;
+ }
+ }
+
+ private equals(targetValue: string, values: string[]): boolean {
+ return values.includes(targetValue);
+ }
+
+ private partiallyMatches(targetValue: string, values: string[]): boolean {
+ return values.some((value) => targetValue.includes(value));
+ }
+
+ private in(targetValue: string, values: string[]): boolean {
+ return values.includes(targetValue);
+ }
+
+ private startsWith(targetValue: string, values: string[]): boolean {
+ return values.some((value) => targetValue.startsWith(value));
+ }
+
+ private endsWith(targetValue: string, values: string[]): boolean {
+ return values.some((value) => targetValue.endsWith(value));
+ }
+
+ private greater(targetValue: string, values: string[]): boolean {
+ const floatTarget = validateAndParseFloat(targetValue);
+ const floatValues = values.map(validateAndParseFloat).filter((value) => !isNaN(value));
+
+ if (!isNaN(floatTarget)) {
+ if (floatValues.length == 0) {
+ return false;
+ }
+ return floatValues.some((value) => floatTarget > value);
+ }
+
+ const semverTarget = semver.valid(targetValue);
+ if (semverTarget) {
+ return values.some((value) => {
+ if (semver.valid(value)) {
+ return semver.gt(semverTarget, value);
+ }
+ return false;
+ });
+ }
+
+ return values.some((value) => targetValue > value);
+ }
+
+ private greaterOrEqual(targetValue: string, values: string[]): boolean {
+ const floatTarget = validateAndParseFloat(targetValue);
+ const floatValues = values.map(validateAndParseFloat).filter((value) => !isNaN(value));
+
+ if (!isNaN(floatTarget)) {
+ if (floatValues.length == 0) {
+ return false;
+ }
+ return floatValues.some((value) => floatTarget >= value);
+ }
+
+ const semverTarget = semver.valid(targetValue);
+ if (semverTarget) {
+ return values.some((value) => {
+ if (semver.valid(value)) {
+ return semver.gte(semverTarget, value);
+ }
+ return false;
+ });
+ }
+
+ return values.some((value) => targetValue >= value);
+ }
+
+ private less(targetValue: string, values: string[]): boolean {
+ const floatTarget = validateAndParseFloat(targetValue);
+ const floatValues = values.map(validateAndParseFloat).filter((value) => !isNaN(value));
+
+ if (!isNaN(floatTarget)) {
+ if (floatValues.length == 0) {
+ return false;
+ }
+ return floatValues.some((value) => floatTarget < value);
+ }
+
+ const semverTarget = semver.valid(targetValue);
+ if (semverTarget) {
+ return values.some((value) => {
+ if (semver.valid(value)) {
+ return semver.lt(semverTarget, value);
+ }
+ return false;
+ });
+ }
+
+ return values.some((value) => targetValue < value);
+ }
+
+ private lessOrEqual(targetValue: string, values: string[]): boolean {
+ const floatTarget = validateAndParseFloat(targetValue);
+ const floatValues = values.map(validateAndParseFloat).filter((value) => !isNaN(value));
+
+ if (!isNaN(floatTarget)) {
+ if (floatValues.length == 0) {
+ return false;
+ }
+ return floatValues.some((value) => floatTarget <= value);
+ }
+
+ const semverTarget = semver.valid(targetValue);
+ if (semverTarget) {
+ return values.some((value) => {
+ if (semver.valid(value)) {
+ return semver.lte(semverTarget, value);
+ }
+ return false;
+ });
+ }
+
+ return values.some((value) => targetValue <= value);
+ }
+
+ private before(targetValue: string, values: string[]): boolean {
+ const intTarget = validateAndParseInt(targetValue);
+ if (isNaN(intTarget)) {
+ return false;
+ }
+ const intValues = values.map((value) => parseInt(value, 10)).filter((value) => !isNaN(value));
+ if (intValues.length == 0) {
+ return false;
+ }
+
+ return intValues.some((value) => intTarget < value);
+ }
+
+ private after(targetValue: string, values: string[]): boolean {
+ const intTarget = parseInt(targetValue, 10);
+ const intValues = values.map((value) => parseInt(value, 10)).filter((value) => !isNaN(value));
+
+ return intValues.some((value) => intTarget > value);
+ }
+}
+
+function isNumericString(input: string): boolean {
+ return /^-?\d*\.?\d+$/.test(input);
+}
+
+function validateAndParseInt(input: string): number {
+ // Check if the string is a valid number using regex
+ if (!isNumericString(input)) {
+ // Will not allow a string like `1a`, `0b`
+ return NaN;
+ }
+
+ // Parse the string to float
+ const result = parseInt(input, 10);
+
+ // If parsing fails, return NaN
+ return isNaN(result) ? NaN : result;
+}
+
+function validateAndParseFloat(input: string): number {
+ // Check if the string is a valid number using regex
+ if (!isNumericString(input)) {
+ // Will not allow a string like `1a`, `0b`
+ return NaN;
+ }
+
+ // Parse the string to float
+ const result = parseFloat(input);
+
+ // If parsing fails, return NaN
+ return isNaN(result) ? NaN : result;
+}
+
+export { ClauseEvaluator };
diff --git a/evaluation/typescript/src/dependencyEvaluator.ts b/evaluation/typescript/src/dependencyEvaluator.ts
new file mode 100644
index 0000000000..af6cf9f40c
--- /dev/null
+++ b/evaluation/typescript/src/dependencyEvaluator.ts
@@ -0,0 +1,24 @@
+import { EVALUATOR_ERRORS } from './errors';
+
+class DependencyEvaluator {
+ evaluate(
+ featureID: string,
+ variationIDs: string[],
+ flagVariations: { [key: string]: string },
+ ): boolean {
+ const targetVarID = flagVariations[featureID];
+
+ if (!targetVarID) {
+ throw EVALUATOR_ERRORS.FeatureNotFound; // Throwing an error if feature is not found
+ }
+
+ for (const varID of variationIDs) {
+ if (varID === targetVarID) {
+ return true; // Match found
+ }
+ }
+ return false; // No match found
+ }
+}
+
+export { DependencyEvaluator };
diff --git a/evaluation/typescript/src/errors.ts b/evaluation/typescript/src/errors.ts
new file mode 100644
index 0000000000..c89ebf96bf
--- /dev/null
+++ b/evaluation/typescript/src/errors.ts
@@ -0,0 +1,10 @@
+const EVALUATOR_ERRORS = {
+ StrategyNotFound: new Error('evaluator: strategy not found'),
+ DefaultStrategyNotFound: new Error('evaluator: default strategy not found'),
+ FeatureNotFound: new Error('evaluator: feature not found'),
+ PrerequisiteVariationNotFound: new Error('evaluator: prerequisite variation not found'),
+ VariationNotFound: new Error('evaluator: variation not found'),
+ UnsupportedStrategy: new Error('evaluator: unsupported strategy'),
+};
+
+export { EVALUATOR_ERRORS };
diff --git a/evaluation/typescript/src/evaluation.ts b/evaluation/typescript/src/evaluation.ts
new file mode 100644
index 0000000000..93e41b724e
--- /dev/null
+++ b/evaluation/typescript/src/evaluation.ts
@@ -0,0 +1,448 @@
+import { EVALUATOR_ERRORS } from './errors';
+import { Clause } from './proto/feature/clause_pb';
+import { Evaluation, UserEvaluations } from './proto/feature/evaluation_pb';
+import { Feature } from './proto/feature/feature_pb';
+import { Reason } from './proto/feature/reason_pb';
+import { SegmentUser } from './proto/feature/segment_pb';
+import { Variation } from './proto/feature/variation_pb';
+import { User } from './proto/user/user_pb';
+import { RuleEvaluator } from './ruleEvaluator';
+import { StrategyEvaluator } from './strategyEvaluator';
+import { NewUserEvaluations, UserEvaluationsID } from './userEvaluation';
+import { createReason } from './modelFactory';
+
+const SECONDS_TO_RE_EVALUATE_ALL = 30 * 24 * 60 * 60; // 30 days
+const SECONDS_FOR_ADJUSTMENT = 10; // 10 seconds
+
+export function EvaluationID(featureID: string, featureVersion: number, userID: string): string {
+ return `${featureID}:${featureVersion}:${userID}`;
+}
+
+class Evaluator {
+ private ruleEvaluator: RuleEvaluator;
+ private strategyEvaluator: StrategyEvaluator;
+
+ constructor() {
+ this.ruleEvaluator = new RuleEvaluator();
+ this.strategyEvaluator = new StrategyEvaluator();
+ }
+
+ async evaluateFeatures(
+ features: Feature[],
+ user: User,
+ mapSegmentUsers: Map,
+ targetTag: string,
+ ): Promise {
+ return this.evaluate(features, user, mapSegmentUsers, false, targetTag);
+ }
+
+ // GetPrerequisiteDownwards gets the features specified as prerequisite by the targetFeatures.
+ getPrerequisiteDownwards(targetFeatures: Feature[], allFeatures: Feature[]): Feature[] {
+ const allFeaturesMap = new Map();
+ for (const feature of allFeatures) {
+ allFeaturesMap.set(feature.getId(), feature);
+ }
+ const dependedOnTargets = getFeaturesDependedOnTargets(targetFeatures, allFeaturesMap);
+ return Object.values(dependedOnTargets);
+ }
+
+ evaluateFeaturesByEvaluatedAt(
+ features: Feature[],
+ user: User,
+ mapSegmentUsers: Map,
+ prevUEID: string,
+ evaluatedAt: number,
+ userAttributesUpdated: boolean,
+ targetTag: string,
+ ): UserEvaluations {
+ if (prevUEID === '') {
+ return this.evaluate(features, user, mapSegmentUsers, true, targetTag);
+ }
+
+ const now = Math.floor(Date.now() / 1000);
+ if (evaluatedAt < now - SECONDS_TO_RE_EVALUATE_ALL) {
+ return this.evaluate(features, user, mapSegmentUsers, true, targetTag);
+ }
+
+ const adjustedEvalAt = evaluatedAt - SECONDS_FOR_ADJUSTMENT;
+ const updatedFeatures = features.filter(
+ (feature) =>
+ feature.getUpdatedAt() > adjustedEvalAt ||
+ (userAttributesUpdated && feature.getRulesList().length > 0),
+ );
+
+ // If the UserEvaluationsID has changed, but both User Attributes and Feature Flags have not been updated,
+ // it is considered unusual and a force update should be performed.
+ if (updatedFeatures.length === 0) {
+ return this.evaluate(features, user, mapSegmentUsers, true, targetTag);
+ }
+
+ const evalTargets = this.getEvalFeatures(updatedFeatures, features);
+ return this.evaluate(evalTargets, user, mapSegmentUsers, false, targetTag);
+ }
+
+ private evaluate(
+ features: Feature[],
+ user: User,
+ mapSegmentUsers: Map,
+ forceUpdate: boolean,
+ targetTag: string,
+ ): UserEvaluations {
+ const flagVariations: { [key: string]: string } = {};
+ // fs need to be sorted in order from upstream to downstream.
+ const sortedFeatures = topologicalSort(features);
+
+ const evaluations: Evaluation[] = [];
+ const archivedIDs: string[] = [];
+
+ for (const feature of sortedFeatures) {
+ if (feature.getArchived()) {
+ // To keep response size small, the feature flags archived long time ago are excluded.
+ if (!this.isArchivedBeforeLastThirtyDays(feature)) {
+ archivedIDs.push(feature.getId());
+ }
+ continue;
+ }
+
+ const segmentUsers = this.listSegmentIDs(feature).flatMap(
+ (id) => mapSegmentUsers.get(id) || [],
+ );
+
+ const [reason, variation] = this.assignUser(feature, user, segmentUsers, flagVariations);
+ // VariationId is used to check if prerequisite flag's result is what user expects it to be.
+ flagVariations[feature.getId()] = variation.getId();
+ // When the tag is set in the request,
+ // it will return only the evaluations of flags that match the tag configured on the dashboard.
+ // When empty, it will return all the evaluations of the flags in the environment.
+ if (targetTag !== '' && !this.tagExist(feature.getTagsList(), targetTag)) {
+ continue;
+ }
+
+ const evaluationID = EvaluationID(feature.getId(), feature.getVersion(), user.getId());
+ const evaluation = new Evaluation();
+ evaluation.setId(evaluationID);
+ evaluation.setFeatureId(feature.getId());
+ evaluation.setFeatureVersion(feature.getVersion());
+ evaluation.setUserId(user.getId());
+ evaluation.setVariationId(variation.getId());
+ evaluation.setVariationName(variation.getName());
+ evaluation.setVariationValue(variation.getValue());
+ // Deprecated
+ // FIXME: Remove the Variation when is no longer being used.
+ // For security reasons, we should remove the variation description.
+ // We copy the variation object to avoid race conditions when removing
+ // the description directly from the `variation`
+ const copyVariation = new Variation();
+ copyVariation.setId(variation.getId());
+ copyVariation.setName(variation.getName());
+ copyVariation.setValue(variation.getValue());
+ evaluation.setVariation(copyVariation);
+ evaluation.setReason(reason);
+
+ evaluations.push(evaluation);
+ }
+
+ const id = UserEvaluationsID(
+ user.getId(),
+ arrayToRecord(user.getDataMap().toArray()),
+ features,
+ );
+ const userEvaluations = NewUserEvaluations(id, evaluations, archivedIDs, forceUpdate);
+ return userEvaluations;
+ }
+
+ private tagExist(tags: string[], target: string): boolean {
+ return tags.includes(target);
+ }
+
+ /*
+ IsArchivedBeforeLastThirtyDays returns a bool value
+ indicating whether the feature flag was archived within the last thirty days.
+ */
+ private isArchivedBeforeLastThirtyDays(feature: Feature): boolean {
+ if (!feature.getArchived()) {
+ return false;
+ }
+ const now = Math.floor(Date.now() / 1000);
+ return feature.getUpdatedAt() < now - SECONDS_TO_RE_EVALUATE_ALL;
+ }
+
+ listSegmentIDs(feature: Feature): string[] {
+ const mapIDs = new Set();
+ for (const rule of feature.getRulesList()) {
+ for (const clause of rule.getClausesList()) {
+ if (clause.getOperator() === Clause.Operator.SEGMENT) {
+ clause.getValuesList().forEach((value) => mapIDs.add(value));
+ }
+ }
+ }
+ return Array.from(mapIDs);
+ }
+
+ assignUser(
+ feature: Feature,
+ user: User,
+ segmentUsers: SegmentUser[],
+ flagVariations: { [key: string]: string },
+ ): [Reason, Variation] {
+ for (const pf of feature.getPrerequisitesList()) {
+ const variationId = flagVariations[pf.getFeatureId()];
+ if (!variationId) {
+ throw EVALUATOR_ERRORS.PrerequisiteVariationNotFound;
+ }
+ if (pf.getVariationId() !== variationId) {
+ if (feature.getOffVariation() !== '') {
+ const variation = this.findVariation(
+ feature.getOffVariation(),
+ feature.getVariationsList(),
+ );
+ const reason = createReason('', Reason.Type.PREREQUISITE);
+ return [reason, variation];
+ }
+ }
+ }
+ // It doesn't assign the user in case of the feature is disabled and OffVariation is not set
+ if (!feature.getEnabled() && feature.getOffVariation() !== '') {
+ const variation = this.findVariation(feature.getOffVariation(), feature.getVariationsList());
+ const reason = createReason('', Reason.Type.OFF_VARIATION);
+ return [reason, variation];
+ }
+
+ // evaluate from top to bottom, return if one rule matches
+ // evaluate targeting rules
+ for (const target of feature.getTargetsList()) {
+ if (target.getUsersList().includes(user.getId())) {
+ const variation = this.findVariation(target.getVariation(), feature.getVariationsList());
+ const reason = createReason('', Reason.Type.TARGET);
+ return [reason, variation];
+ }
+ }
+
+ // evaluate ruleset
+ const rule = this.ruleEvaluator.evaluate(
+ feature.getRulesList(),
+ user,
+ segmentUsers,
+ flagVariations,
+ );
+ if (rule) {
+ const strategy = rule.getStrategy();
+ if (strategy == undefined) {
+ throw EVALUATOR_ERRORS.StrategyNotFound;
+ }
+ const variation = this.strategyEvaluator.evaluate(
+ strategy,
+ user.getId(),
+ feature.getVariationsList(),
+ feature.getId(),
+ feature.getSamplingSeed(),
+ );
+ const reason = createReason(rule.getId(), Reason.Type.RULE);
+ return [reason, variation];
+ }
+
+ // use default strategy
+ const defaultStrategy = feature.getDefaultStrategy();
+ if (defaultStrategy == undefined) {
+ throw EVALUATOR_ERRORS.DefaultStrategyNotFound;
+ }
+
+ const variation = this.strategyEvaluator.evaluate(
+ defaultStrategy,
+ user.getId(),
+ feature.getVariationsList(),
+ feature.getId(),
+ feature.getSamplingSeed(),
+ );
+ const reason = createReason('', Reason.Type.DEFAULT);
+ return [reason, variation];
+ }
+
+ getEvalFeatures(targetFeatures: Feature[], allFeatures: Feature[]): Feature[] {
+ const allFeaturesMap = new Map();
+ for (const feature of allFeatures) {
+ allFeaturesMap.set(feature.getId(), feature);
+ }
+
+ const evals1 = getFeaturesDependedOnTargets(targetFeatures, allFeaturesMap);
+ const evals2 = getFeaturesDependsOnTargets(targetFeatures, allFeaturesMap);
+ const mergedEvals = { ...evals1, ...evals2 };
+ return Object.values(mergedEvals);
+ }
+
+ private findVariation(v: string, variations: Variation[]): Variation {
+ const variation = variations.find((variation) => variation.getId() === v);
+ if (!variation) {
+ throw EVALUATOR_ERRORS.VariationNotFound;
+ }
+ return variation;
+ }
+}
+
+enum Mark {
+ Unvisited,
+ Temporary,
+ Permanently,
+}
+
+// FeatureIDsDependsOn returns the ids of the features that this feature depends on.
+function featureIDsDependsOn(feature: Feature): Array {
+ const ids: Array = [];
+
+ // Iterate over prerequisites and add their FeatureId
+ feature.getPrerequisitesList().forEach((p) => {
+ ids.push(p.getFeatureId());
+ });
+
+ // Iterate over rules and collect ids from clauses where the operator is FEATURE_FLAG
+ feature.getRulesList().forEach((rule) => {
+ rule.getClausesList().forEach((clause) => {
+ if (clause.getOperator() === Clause.Operator.FEATURE_FLAG) {
+ ids.push(clause.getAttribute());
+ }
+ });
+ });
+
+ return ids;
+}
+
+// Error types
+class ErrCycleExists extends Error {
+ constructor() {
+ super('Cycle exists in the graph');
+ }
+}
+
+class ErrFeatureNotFound extends Error {
+ constructor() {
+ super('Feature not found');
+ }
+}
+
+// Topological sort function
+function topologicalSort(features: Array): Array {
+ const marks: { [key: string]: Mark } = {};
+ const mapFeatures: { [key: string]: Feature } = {};
+
+ features.forEach((f) => {
+ marks[f.getId()] = Mark.Unvisited;
+ mapFeatures[f.getId()] = f;
+ });
+
+ const sortedFeatures: Array = [];
+
+ const sort = (f: Feature) => {
+ const fId = f.getId();
+ if (marks[fId] === Mark.Permanently) return;
+
+ if (marks[fId] === Mark.Temporary) {
+ throw new ErrCycleExists();
+ }
+
+ marks[fId] = Mark.Temporary;
+
+ const dependentFeatureIds = featureIDsDependsOn(f);
+ for (const fid of dependentFeatureIds) {
+ const pf = mapFeatures[fid];
+ if (!pf) {
+ throw new ErrFeatureNotFound();
+ }
+
+ sort(pf);
+ }
+
+ marks[fId] = Mark.Permanently;
+ sortedFeatures.push(f);
+ };
+
+ // Process each feature
+ for (const f of features) {
+ if (marks[f.getId()] === Mark.Unvisited) {
+ sort(f);
+ }
+ }
+
+ return sortedFeatures;
+}
+
+// getFeaturesDependedOnTargets returns the features that are depended on the target features.
+// targetFeatures are included in the result.
+function getFeaturesDependedOnTargets(
+ targets: Array,
+ all: Map,
+): { [key: string]: Feature } {
+ const evals: { [key: string]: Feature } = {};
+
+ const dfs = (f: Feature): void => {
+ // If the feature is already in the evals map, skip
+ if (evals[f.getId()]) return;
+
+ // Add feature to evals
+ evals[f.getId()] = f;
+
+ // Get dependent features recursively
+ const featureDependencies = featureIDsDependsOn(f);
+ featureDependencies.forEach((fid) => {
+ const target = all.get(fid);
+ if (target !== undefined) {
+ dfs(target);
+ }
+ });
+ };
+
+ // Start DFS for each target feature
+ targets.forEach((f) => dfs(f));
+
+ return evals;
+}
+
+// getFeaturesDependsOnTargets returns the features that depend on the target features.
+// targetFeatures are included in the result.
+function getFeaturesDependsOnTargets(
+ targets: Array,
+ all: Map,
+): { [key: string]: Feature } {
+ const evals: { [key: string]: Feature } = {};
+
+ // Mark target features in the evals map initially
+ targets.forEach((f) => {
+ evals[f.getId()] = f;
+ });
+
+ // Depth-first search to determine if a feature depends on a target feature
+ const dfs = (f: Feature): boolean => {
+ if (evals[f.getId()]) {
+ return true;
+ }
+
+ const featureDependencies = featureIDsDependsOn(f);
+ for (const fid of featureDependencies) {
+ const dependentFeature = all.get(fid);
+ if (dependentFeature && dfs(dependentFeature)) {
+ // If the feature depends on one of the target features, add it to evals
+ evals[f.getId()] = f;
+ return true;
+ }
+ }
+ return false;
+ };
+
+ // Apply DFS for all features, except target features
+ all.forEach((f) => {
+ dfs(f);
+ });
+
+ return evals;
+}
+
+function arrayToRecord(arr: Array<[string, string]>): Record {
+ return arr.reduce(
+ (acc, [key, value]) => {
+ acc[key] = value;
+ return acc;
+ },
+ {} as Record,
+ );
+}
+
+export { Evaluator };
diff --git a/evaluation/typescript/src/index.ts b/evaluation/typescript/src/index.ts
new file mode 100644
index 0000000000..b4b78cb03b
--- /dev/null
+++ b/evaluation/typescript/src/index.ts
@@ -0,0 +1,59 @@
+import { Evaluator } from './evaluation';
+import { SegmentUser, SegmentUsers } from './proto/feature/segment_pb';
+import { Feature } from './proto/feature/feature_pb';
+import { NewUserEvaluations } from './userEvaluation';
+import { User } from './proto/user/user_pb';
+import { Evaluation, UserEvaluations } from './proto/feature/evaluation_pb';
+import { Strategy } from './proto/feature/strategy_pb';
+import { Clause } from './proto/feature/clause_pb';
+import { Reason } from './proto/feature/reason_pb';
+import {
+ createClause,
+ createFixedStrategy,
+ createRolloutStrategy,
+ createReason,
+ createRule,
+ createPrerequisite,
+ createFeature,
+ createEvaluation,
+ createSegmentUser,
+ createStrategy,
+ createTarget,
+ createUser,
+ createVariation,
+} from './modelFactory';
+import {
+ GetFeatureFlagsRequest,
+ GetFeatureFlagsResponse,
+ GetSegmentUsersRequest,
+ GetSegmentUsersResponse,
+} from './proto/gateway/service_pb';
+import { SourceId } from './proto/event/client/event_pb';
+import { GatewayClient, ServiceError } from './proto/gateway/service_pb_service';
+
+export { Evaluator, NewUserEvaluations, Evaluation, UserEvaluations };
+export { User, SegmentUser, SegmentUsers, Feature };
+export { Strategy, Clause, Reason };
+export {
+ createClause,
+ createFixedStrategy,
+ createRolloutStrategy,
+ createReason,
+ createRule,
+ createPrerequisite,
+ createFeature,
+ createEvaluation,
+ createSegmentUser,
+ createStrategy,
+ createTarget,
+ createUser,
+ createVariation,
+};
+export {
+ GetFeatureFlagsRequest,
+ GetFeatureFlagsResponse,
+ GetSegmentUsersRequest,
+ GetSegmentUsersResponse,
+};
+export { SourceId };
+export { GatewayClient, ServiceError };
diff --git a/evaluation/typescript/src/modelFactory.ts b/evaluation/typescript/src/modelFactory.ts
new file mode 100644
index 0000000000..820853cd51
--- /dev/null
+++ b/evaluation/typescript/src/modelFactory.ts
@@ -0,0 +1,249 @@
+import { Clause } from './proto/feature/clause_pb';
+import { Evaluation } from './proto/feature/evaluation_pb';
+import { Feature } from './proto/feature/feature_pb';
+import { Prerequisite } from './proto/feature/prerequisite_pb';
+import { Reason } from './proto/feature/reason_pb';
+import { Rule } from './proto/feature/rule_pb';
+import { SegmentUser } from './proto/feature/segment_pb';
+import { FixedStrategy, RolloutStrategy, Strategy } from './proto/feature/strategy_pb';
+import { Target } from './proto/feature/target_pb';
+import { Variation } from './proto/feature/variation_pb';
+import { User } from './proto/user/user_pb';
+
+// Helper function to create a User instance
+export function createUser(id: string, data: Record | null): User {
+ const user = new User();
+ user.setId(id);
+ let map = user.getDataMap();
+ if (data != null) {
+ Object.entries(data).forEach(([key, value]) => map.set(key, value));
+ }
+ return user;
+}
+
+export function createFeature(
+ options: {
+ id?: string;
+ name?: string;
+ version?: number;
+ enabled?: boolean;
+ createdAt?: number;
+ variationType?: Feature.VariationTypeMap[keyof Feature.VariationTypeMap];
+ variations?: Array<{ id: string; value: string; name: string; description: string }>;
+ targets?: Array<{ variation: string; users: string[] }>;
+ rules?: Array<{
+ id: string;
+ attribute: string;
+ operator: Clause.OperatorMap[keyof Clause.OperatorMap];
+ values: string[];
+ fixedVariation: string;
+ }>;
+ defaultStrategy?:
+ | { type: Strategy.TypeMap[keyof Strategy.TypeMap]; variation: string }
+ | undefined;
+ prerequisitesList?: Array;
+ tagList?: Array;
+ offVariation?: string;
+ } = {},
+): Feature {
+ const defaultOptions = {
+ id: '',
+ name: '',
+ version: 0,
+ enabled: false,
+ createdAt: Date.now(),
+ variationType: Feature.VariationType.STRING,
+ variations: [],
+ targets: [],
+ rules: [],
+ defaultStrategy: undefined,
+ prerequisitesList: [],
+ tagList: [],
+ offVariation: undefined,
+ };
+
+ const finalOptions = { ...defaultOptions, ...options };
+
+ const feature = new Feature();
+ feature.setId(finalOptions.id);
+ feature.setName(finalOptions.name);
+ feature.setVersion(finalOptions.version);
+ feature.setEnabled(finalOptions.enabled);
+ feature.setCreatedAt(finalOptions.createdAt);
+ feature.setVariationType(finalOptions.variationType);
+
+ // Set variations
+ const variationList = finalOptions.variations.map((v) =>
+ createVariation(v.id, v.value, v.name, v.description),
+ );
+ feature.setVariationsList(variationList);
+
+ // Set targets
+ const targetList = finalOptions.targets.map((t) => createTarget(t.variation, t.users));
+ feature.setTargetsList(targetList);
+
+ // Set rules
+ const ruleList = finalOptions.rules.map((r) =>
+ createRule(r.id, r.attribute, r.operator, r.values, r.fixedVariation),
+ );
+ feature.setRulesList(ruleList);
+
+ // Set default strategy
+ const defaultStrategy = finalOptions.defaultStrategy;
+ if (defaultStrategy !== undefined) {
+ const defaultFixedStrategy = createFixedStrategy(defaultStrategy.variation);
+ const strategy = createStrategy({
+ type: defaultStrategy.type,
+ fixedStrategy: defaultFixedStrategy,
+ });
+ feature.setDefaultStrategy(strategy);
+ }
+
+ feature.setPrerequisitesList(finalOptions.prerequisitesList);
+ feature.setTagsList(finalOptions.tagList);
+
+ if (finalOptions.offVariation !== undefined) {
+ feature.setOffVariation(finalOptions.offVariation);
+ }
+
+ return feature;
+}
+
+export function createTarget(variation: string, users: string[]): Target {
+ const target = new Target();
+ target.setVariation(variation);
+ target.setUsersList(users);
+ return target;
+}
+
+export function createFixedStrategy(variation: string): FixedStrategy {
+ const fixedStrategy = new FixedStrategy();
+ fixedStrategy.setVariation(variation);
+ return fixedStrategy;
+}
+
+export function createRolloutStrategy(options: {
+ variations: Array<{ variation: string; weight: number }>;
+}): RolloutStrategy {
+ const rolloutStrategy = new RolloutStrategy();
+ const variations = options.variations.map((v) => {
+ const variation = new RolloutStrategy.Variation();
+ variation.setVariation(v.variation);
+ variation.setWeight(v.weight);
+ return variation;
+ });
+ rolloutStrategy.setVariationsList(variations);
+ return rolloutStrategy;
+}
+
+export function createStrategy(options: {
+ type: Strategy.TypeMap[keyof Strategy.TypeMap];
+ fixedStrategy?: FixedStrategy;
+ rolloutStrategy?: RolloutStrategy;
+}): Strategy {
+ const strategy = new Strategy();
+ strategy.setType(options.type);
+ strategy.setFixedStrategy(options.fixedStrategy);
+ strategy.setRolloutStrategy(options.rolloutStrategy);
+ return strategy;
+}
+
+//TODO: FIX ME - Rule should have a constructor that accepts all the parameters
+//Current is missing many parameters
+export function createRule(
+ id: string,
+ attribute: string,
+ operator: Clause.OperatorMap[keyof Clause.OperatorMap],
+ values: string[],
+ fixedVariation: string,
+): Rule {
+ const rule = new Rule();
+ rule.setId(id);
+
+ const fixedStrategy = createFixedStrategy(fixedVariation);
+ const strategy = createStrategy({ type: Strategy.Type.FIXED, fixedStrategy });
+ rule.setStrategy(strategy);
+
+ rule.setClausesList([createClause(id, attribute, operator, values)]);
+ return rule;
+}
+
+export function createClause(
+ id: string,
+ attribute: string,
+ operator: Clause.OperatorMap[keyof Clause.OperatorMap],
+ values: string[],
+): Clause {
+ const clause = new Clause();
+ clause.setId(id);
+ clause.setAttribute(attribute);
+ clause.setOperator(operator);
+ clause.setValuesList(values);
+ return clause;
+}
+
+export function createSegmentUser(
+ userId: string,
+ segmentId: string,
+ state: SegmentUser.StateMap[keyof SegmentUser.StateMap],
+): SegmentUser {
+ const segmentUser = new SegmentUser();
+ segmentUser.setUserId(userId);
+ segmentUser.setSegmentId(segmentId);
+ segmentUser.setState(state);
+ return segmentUser;
+}
+
+export function createPrerequisite(featureId: string, variationId: string): Prerequisite {
+ const prerequisite = new Prerequisite();
+ prerequisite.setFeatureId(featureId);
+ prerequisite.setVariationId(variationId);
+ return prerequisite;
+}
+
+// Function to create a Variation instance with the provided parameters
+export function createVariation(
+ id: string,
+ value: string,
+ name: string,
+ description: string,
+): Variation {
+ const variation = new Variation();
+ variation.setId(id);
+ variation.setValue(value);
+ variation.setName(name);
+ variation.setDescription(description);
+
+ return variation;
+}
+
+export function createEvaluation(
+ id: string,
+ featureId: string,
+ featureVersion: number,
+ userId: string,
+ variationId: string,
+ variationValue: string,
+ variationName: string,
+ reason: Reason,
+): Evaluation {
+ const evaluation = new Evaluation();
+ evaluation.setId(id);
+ evaluation.setFeatureId(featureId);
+ evaluation.setFeatureVersion(featureVersion);
+ evaluation.setUserId(userId);
+ evaluation.setVariationId(variationId);
+ evaluation.setVariationValue(variationValue);
+ evaluation.setVariationName(variationName);
+ evaluation.setReason(reason);
+ return evaluation;
+}
+
+//TODO: should we set the ruleId to empty string as default?
+//TODO: create optional constructor for Reason
+export function createReason(ruleId: string, type: Reason.TypeMap[keyof Reason.TypeMap]): Reason {
+ const reason = new Reason();
+ reason.setType(type);
+ reason.setRuleId(ruleId);
+ return reason;
+}
diff --git a/evaluation/typescript/src/ruleEvaluator.ts b/evaluation/typescript/src/ruleEvaluator.ts
new file mode 100644
index 0000000000..9b1bc09440
--- /dev/null
+++ b/evaluation/typescript/src/ruleEvaluator.ts
@@ -0,0 +1,67 @@
+import { Rule } from './proto/feature/rule_pb';
+import { Clause } from './proto/feature/clause_pb';
+import { User } from './proto/user/user_pb';
+import { SegmentUser } from './proto/feature/segment_pb';
+import { ClauseEvaluator } from './clauseEvaluator';
+//
+class RuleEvaluator {
+ private clauseEvaluator: ClauseEvaluator;
+
+ constructor() {
+ this.clauseEvaluator = new ClauseEvaluator();
+ }
+
+ evaluate(
+ rules: Rule[],
+ user: User,
+ segmentUsers: SegmentUser[],
+ flagVariations: { [key: string]: string },
+ ): Rule | null {
+ for (const rule of rules) {
+ const matched = this.evaluateRule(rule, user, segmentUsers, flagVariations);
+ if (matched) {
+ return rule;
+ }
+ }
+ return null;
+ }
+
+ private evaluateRule(
+ rule: Rule,
+ user: User,
+ segmentUsers: SegmentUser[],
+ flagVariations: { [key: string]: string },
+ ): boolean {
+ for (const clause of rule.getClausesList()) {
+ const matched = this.evaluateClause(clause, user, segmentUsers, flagVariations);
+ if (!matched) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private evaluateClause(
+ clause: Clause,
+ user: User,
+ segmentUsers: SegmentUser[],
+ flagVariations: { [key: string]: string },
+ ): boolean {
+ let targetAttr: string | undefined;
+ if (clause.getAttribute() === 'id') {
+ targetAttr = user.getId();
+ } else {
+ targetAttr = user.getDataMap().get(clause.getAttribute());
+ }
+
+ return this.clauseEvaluator.evaluate(
+ targetAttr || '', // Handling the case where targetAttr is undefined
+ clause,
+ user.getId(),
+ segmentUsers,
+ flagVariations,
+ );
+ }
+}
+
+export { RuleEvaluator };
diff --git a/evaluation/typescript/src/segmentEvaluator.ts b/evaluation/typescript/src/segmentEvaluator.ts
new file mode 100644
index 0000000000..f8885200a1
--- /dev/null
+++ b/evaluation/typescript/src/segmentEvaluator.ts
@@ -0,0 +1,44 @@
+import { SegmentUser } from './proto/feature/segment_pb';
+//
+class SegmentEvaluator {
+ evaluate(segmentIDs: string[], userID: string, segmentUsers: SegmentUser[]): boolean {
+ return this.findSegmentUser(segmentIDs, userID, SegmentUser.State.INCLUDED, segmentUsers);
+ }
+
+ private findSegmentUser(
+ segmentIDs: string[],
+ userID: string,
+ state: SegmentUser.StateMap[keyof SegmentUser.StateMap],
+ segmentUsers: SegmentUser[],
+ ): boolean {
+ for (const segmentID of segmentIDs) {
+ if (!this.containsSegmentUser(segmentID, userID, state, segmentUsers)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private containsSegmentUser(
+ segmentID: string,
+ userID: string,
+ state: SegmentUser.StateMap[keyof SegmentUser.StateMap],
+ segmentUsers: SegmentUser[],
+ ): boolean {
+ for (const user of segmentUsers) {
+ if (user.getSegmentId() !== segmentID) {
+ continue;
+ }
+ if (user.getUserId() !== userID) {
+ continue;
+ }
+ if (user.getState() !== state) {
+ continue;
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
+export { SegmentEvaluator };
diff --git a/evaluation/typescript/src/strategyEvaluator.ts b/evaluation/typescript/src/strategyEvaluator.ts
new file mode 100644
index 0000000000..e3580e4a02
--- /dev/null
+++ b/evaluation/typescript/src/strategyEvaluator.ts
@@ -0,0 +1,76 @@
+import * as crypto from 'crypto';
+import { RolloutStrategy, Strategy } from './proto/feature/strategy_pb';
+import { Variation } from './proto/feature/variation_pb';
+//
+const MAX = 0xffffffffffffffffn;
+
+class StrategyEvaluator {
+ evaluate(
+ strategy: Strategy,
+ userID: string,
+ variations: Variation[],
+ featureID: string,
+ samplingSeed: string,
+ ): Variation {
+ switch (strategy.getType()) {
+ case Strategy.Type.FIXED:
+ return this.findVariation(strategy.getFixedStrategy()?.getVariation() || '', variations);
+ case Strategy.Type.ROLLOUT:
+ const rolloutStrategy = strategy.getRolloutStrategy();
+ if (rolloutStrategy !== undefined) {
+ const variationID = this.rollout(rolloutStrategy, userID, featureID, samplingSeed);
+ return this.findVariation(variationID, variations);
+ }
+ throw new Error('Missing rollout strategy');
+ default:
+ throw new Error('Unsupported strategy');
+ }
+ }
+
+ private rollout(
+ strategy: RolloutStrategy,
+ userID: string,
+ featureID: string,
+ samplingSeed: string,
+ ): string {
+ const bucket = this.bucket(userID, featureID, samplingSeed);
+
+ let sum = 0.0;
+ for (const variation of strategy.getVariationsList()) {
+ sum += variation.getWeight() / 100000.0;
+ if (bucket < sum) {
+ return variation.getVariation();
+ }
+ }
+ throw new Error('Variation not found');
+ }
+
+ private bucket(userID: string, featureID: string, samplingSeed: string): number {
+ try {
+ const hash = this.hash(userID, featureID, samplingSeed);
+ const intVal = BigInt('0x' + hash.slice(0, 16)); // Convert the first 16 hex characters to BigInt
+
+ // Divide the BigInt value by `max` and convert it to a number. Use Number() since we need a float.
+ return Number(intVal) / Number(MAX);
+ } catch (error) {
+ console.error('Failed to calculate bucket value:', error);
+ throw error;
+ }
+ }
+
+ private hash(userID: string, featureID: string, samplingSeed: string): string {
+ const concat = `${featureID}-${userID}${samplingSeed}`;
+ return crypto.createHash('md5').update(concat).digest('hex');
+ }
+
+ private findVariation(variationID: string, variations: Variation[]): Variation {
+ for (const variation of variations) {
+ if (variation.getId() === variationID) {
+ return variation;
+ }
+ }
+ throw new Error('Variation not found');
+ }
+}
+
+export { StrategyEvaluator };
diff --git a/evaluation/typescript/src/userEvaluation.ts b/evaluation/typescript/src/userEvaluation.ts
new file mode 100644
index 0000000000..1329ff7c59
--- /dev/null
+++ b/evaluation/typescript/src/userEvaluation.ts
@@ -0,0 +1,76 @@
+import { Evaluation, UserEvaluations } from './proto/feature/evaluation_pb';
+import { Feature } from './proto/feature/feature_pb';
+import fnv from 'fnv-plus';
+
+//
+function NewUserEvaluations(
+ id: string,
+ evaluations: Evaluation[],
+ archivedFeaturesIds: string[],
+ forceUpdate: boolean,
+): UserEvaluations {
+ const now = Math.floor(Date.now() / 1000); // Equivalent to Unix time
+
+ const userEvaluations = new UserEvaluations();
+ userEvaluations.setId(id);
+ userEvaluations.setEvaluationsList(evaluations);
+ userEvaluations.setCreatedAt(now);
+ userEvaluations.setArchivedFeatureIdsList(archivedFeaturesIds);
+ userEvaluations.setForceUpdate(forceUpdate);
+
+ return userEvaluations;
+}
+
+function sortMapKeys(data: Record): string[] {
+ const keys = Object.keys(data);
+ keys.sort(); // Sort keys alphabetically
+ return keys;
+}
+
+function GenerateFeaturesID(features: Feature[]): string {
+ // Sort features based on the 'id'
+ features.sort((a, b) => (a.getId() < b.getId() ? -1 : 1));
+
+ // Initialize FNV-1a 64-bit hash string
+ let hashInput = '';
+
+ // Concatenate each feature's 'id' and 'version' into the hash input
+ features.forEach((feature) => {
+ hashInput += `${feature.getId()}:${feature.getVersion()}`;
+ });
+
+ // Generate the FNV-1a 64-bit hash and return it as a decimal string
+ const hash = fnv.hash(hashInput, 64);
+ return hash.dec();
+}
+
+function UserEvaluationsID(
+ userID: string,
+ userMetadata: Record, // equivalent to map[string]string in Go
+ features: Feature[],
+): string {
+ // Sort features by ID
+ features.sort((a, b) => (a.getId() < b.getId() ? -1 : 1));
+
+ // Initialize FNV-1a 64-bit hash input
+ let hashInput = userID;
+
+ // Sort and append userMetadata to the hash input
+ const keys = sortMapKeys(userMetadata);
+ keys.forEach((key) => {
+ hashInput += `${key}:${userMetadata[key]}`;
+ });
+
+ // Append feature details to the hash input
+ features.forEach((feature) => {
+ hashInput += `${feature.getId()}:${feature.getUpdatedAt()}`;
+ });
+
+ // Generate the FNV-1a 64-bit hash
+ const hash = fnv.hash(hashInput, 64);
+
+ // Return the hashed value as a decimal string
+ return hash.dec();
+}
+
+export { UserEvaluationsID, GenerateFeaturesID, sortMapKeys, NewUserEvaluations };
diff --git a/evaluation/typescript/tsconfig.json b/evaluation/typescript/tsconfig.json
new file mode 100644
index 0000000000..8a79104ef5
--- /dev/null
+++ b/evaluation/typescript/tsconfig.json
@@ -0,0 +1,43 @@
+{
+ "compilerOptions": {
+ "module": "node16",
+ "moduleResolution": "node16",
+ "moduleDetection": "force",
+ "target": "ES2022", // Node.js 18
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ES2022"
+ ],
+ "resolveJsonModule": false, // ESM doesn't yet support JSON modules.
+ "jsx": "react",
+ "declaration": true,
+ "newLine": "lf",
+ "stripInternal": true,
+ "strict": true,
+ "noImplicitReturns": true,
+ "noImplicitOverride": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedIndexedAccess": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noEmitOnError": true,
+ "useDefineForClassFields": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "outDir": "./__lib/",
+ "types": [
+ "node"
+ ]
+ },
+ "include": [
+ "./src/**/*",
+ ],
+ "exclude": [
+ "./src/**/__tests__/*",
+ ],
+ /* Module Resolution Options */
+ /* Advanced Options */
+ "pretty": true,
+}
\ No newline at end of file
diff --git a/evaluation/typescript/tsconfig.test.json b/evaluation/typescript/tsconfig.test.json
new file mode 100644
index 0000000000..67d0fdcdb2
--- /dev/null
+++ b/evaluation/typescript/tsconfig.test.json
@@ -0,0 +1,13 @@
+{
+ "extends": "./tsconfig",
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "outDir": "./__test/",
+ "types": [
+ "@types/node",
+ ]
+ },
+ "exclude": [
+ "./src/**/proto/*"
+ ],
+}
\ No newline at end of file
diff --git a/evaluation/typescript/tslint.json b/evaluation/typescript/tslint.json
new file mode 100644
index 0000000000..dad0b69dd5
--- /dev/null
+++ b/evaluation/typescript/tslint.json
@@ -0,0 +1,7 @@
+{
+ "extends": ["tslint-config-fluct/config/basic.json"],
+
+ "rules": {
+ "no-implicit-dependencies": [true]
+ }
+}
diff --git a/evaluation/typescript/yarn.lock b/evaluation/typescript/yarn.lock
new file mode 100644
index 0000000000..8312e83b59
--- /dev/null
+++ b/evaluation/typescript/yarn.lock
@@ -0,0 +1,6098 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/cli@7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8"
+ integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.25"
+ commander "^6.2.0"
+ convert-source-map "^2.0.0"
+ fs-readdir-recursive "^1.1.0"
+ glob "^7.2.0"
+ make-dir "^2.1.0"
+ slash "^2.0.0"
+ optionalDependencies:
+ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
+ chokidar "^3.4.0"
+
+"@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402"
+ integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==
+
+"@babel/core@7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
+ integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.0"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-module-transforms" "^7.25.2"
+ "@babel/helpers" "^7.25.0"
+ "@babel/parser" "^7.25.0"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.2"
+ "@babel/types" "^7.25.2"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.25.0", "@babel/generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56"
+ integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-annotate-as-pure@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972"
+ integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622"
+ integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.2", "@babel/helper-compilation-targets@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4"
+ integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==
+ dependencies:
+ "@babel/compat-data" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b"
+ integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e"
+ integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ regexpu-core "^6.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.6.2":
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
+ integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+
+"@babel/helper-member-expression-to-functions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574"
+ integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-module-imports@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472"
+ integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-module-transforms@^7.25.2", "@babel/helper-module-transforms@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a"
+ integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/helper-optimise-call-expression@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a"
+ integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c"
+ integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==
+
+"@babel/helper-remap-async-to-generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021"
+ integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-wrap-function" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/helper-replace-supers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5"
+ integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/helper-simple-access@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0"
+ integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c"
+ integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8", "@babel/helper-validator-option@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729"
+ integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==
+
+"@babel/helper-wrap-function@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7"
+ integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==
+ dependencies:
+ "@babel/template" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helpers@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2"
+ integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==
+ dependencies:
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.25.0", "@babel/parser@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2"
+ integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==
+ dependencies:
+ "@babel/types" "^7.25.8"
+
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64"
+ integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046"
+ integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4"
+ integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a"
+ integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/plugin-transform-optional-chaining" "^7.25.7"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5"
+ integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f"
+ integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f"
+ integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165"
+ integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b"
+ integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386"
+ integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-async-generator-functions@^7.25.0":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz#3331de02f52cc1f2c75b396bec52188c85b0b1ec"
+ integrity sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-remap-async-to-generator" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/plugin-transform-async-to-generator@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52"
+ integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-remap-async-to-generator" "^7.25.7"
+
+"@babel/plugin-transform-block-scoped-functions@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c"
+ integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-block-scoping@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a"
+ integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-class-properties@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523"
+ integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-class-static-block@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz#a8af22028920fe404668031eceb4c3aadccb5262"
+ integrity sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-classes@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb"
+ integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65"
+ integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/template" "^7.25.7"
+
+"@babel/plugin-transform-destructuring@^7.24.8":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560"
+ integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-dotall-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02"
+ integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93"
+ integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141"
+ integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-dynamic-import@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz#f1edbe75b248cf44c70c8ca8ed3818a668753aaa"
+ integrity sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-exponentiation-operator@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f"
+ integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-export-namespace-from@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz#d1988c3019a380b417e0516418b02804d3858145"
+ integrity sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-for-of@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669"
+ integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+
+"@babel/plugin-transform-function-name@^7.25.1":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd"
+ integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/plugin-transform-json-strings@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz#6fb3ec383a2ea92652289fdba653e3f9de722694"
+ integrity sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-literals@^7.25.2":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3"
+ integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz#01868ff92daa9e525b4c7902aa51979082a05710"
+ integrity sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-member-expression-literals@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5"
+ integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-modules-amd@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d"
+ integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd"
+ integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+
+"@babel/plugin-transform-modules-systemjs@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b"
+ integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/plugin-transform-modules-umd@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367"
+ integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d"
+ integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-new-target@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9"
+ integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz#befb4900c130bd52fccf2b926314557987f1b552"
+ integrity sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-numeric-separator@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz#91e370486371637bd42161052f2602c701386891"
+ integrity sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-object-rest-spread@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz#0904ac16bcce41df4db12d915d6780f85c7fb04b"
+ integrity sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-transform-parameters" "^7.25.7"
+
+"@babel/plugin-transform-object-super@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661"
+ integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+
+"@babel/plugin-transform-optional-catch-binding@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz#2649b86a3bb202c6894ec81a6ddf41b94d8f3103"
+ integrity sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-optional-chaining@^7.24.8", "@babel/plugin-transform-optional-chaining@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz#f46283b78adcc5b6ab988a952f989e7dce70653f"
+ integrity sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+
+"@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7"
+ integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-private-methods@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80"
+ integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-private-property-in-object@^7.24.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz#1234f856ce85e061f9688764194e51ea7577c434"
+ integrity sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-property-literals@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d"
+ integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-regenerator@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e"
+ integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ regenerator-transform "^0.15.2"
+
+"@babel/plugin-transform-reserved-words@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995"
+ integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-shorthand-properties@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f"
+ integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-spread@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998"
+ integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+
+"@babel/plugin-transform-sticky-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17"
+ integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-template-literals@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b"
+ integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-typeof-symbol@^7.24.8":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb"
+ integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-typescript@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe"
+ integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/plugin-syntax-typescript" "^7.25.7"
+
+"@babel/plugin-transform-unicode-escapes@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81"
+ integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-unicode-property-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e"
+ integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-unicode-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809"
+ integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c"
+ integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/preset-env@7.25.3":
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c"
+ integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==
+ dependencies:
+ "@babel/compat-data" "^7.25.2"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3"
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.24.7"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.24.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.0"
+ "@babel/plugin-transform-async-to-generator" "^7.24.7"
+ "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
+ "@babel/plugin-transform-block-scoping" "^7.25.0"
+ "@babel/plugin-transform-class-properties" "^7.24.7"
+ "@babel/plugin-transform-class-static-block" "^7.24.7"
+ "@babel/plugin-transform-classes" "^7.25.0"
+ "@babel/plugin-transform-computed-properties" "^7.24.7"
+ "@babel/plugin-transform-destructuring" "^7.24.8"
+ "@babel/plugin-transform-dotall-regex" "^7.24.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.24.7"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0"
+ "@babel/plugin-transform-dynamic-import" "^7.24.7"
+ "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
+ "@babel/plugin-transform-export-namespace-from" "^7.24.7"
+ "@babel/plugin-transform-for-of" "^7.24.7"
+ "@babel/plugin-transform-function-name" "^7.25.1"
+ "@babel/plugin-transform-json-strings" "^7.24.7"
+ "@babel/plugin-transform-literals" "^7.25.2"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
+ "@babel/plugin-transform-member-expression-literals" "^7.24.7"
+ "@babel/plugin-transform-modules-amd" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.25.0"
+ "@babel/plugin-transform-modules-umd" "^7.24.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
+ "@babel/plugin-transform-new-target" "^7.24.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
+ "@babel/plugin-transform-numeric-separator" "^7.24.7"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.7"
+ "@babel/plugin-transform-object-super" "^7.24.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.8"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/plugin-transform-private-methods" "^7.24.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.7"
+ "@babel/plugin-transform-property-literals" "^7.24.7"
+ "@babel/plugin-transform-regenerator" "^7.24.7"
+ "@babel/plugin-transform-reserved-words" "^7.24.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.7"
+ "@babel/plugin-transform-spread" "^7.24.7"
+ "@babel/plugin-transform-sticky-regex" "^7.24.7"
+ "@babel/plugin-transform-template-literals" "^7.24.7"
+ "@babel/plugin-transform-typeof-symbol" "^7.24.8"
+ "@babel/plugin-transform-unicode-escapes" "^7.24.7"
+ "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ core-js-compat "^3.37.1"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/preset-typescript@7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1"
+ integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-option" "^7.24.7"
+ "@babel/plugin-syntax-jsx" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.7"
+ "@babel/plugin-transform-typescript" "^7.24.7"
+
+"@babel/runtime@^7.8.4":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6"
+ integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.25.0", "@babel/template@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769"
+ integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/traverse@^7.25.2", "@babel/traverse@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8"
+ integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.25.2", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.4.4":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1"
+ integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ to-fast-properties "^2.0.0"
+
+"@bazel/hide-bazel-files@1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@bazel/hide-bazel-files/-/hide-bazel-files-1.7.0.tgz#7cb140c23c4269d6464c24be0a2acf0241d2a31d"
+ integrity sha512-pvdyRX/EsU8n+oElFb+OZ9i5M48HNFR+Z4D3vc0qDGiJ8oly9fZcUb2gbw4CzyeovJz0IzjSxjqMS6cp5gKoeg==
+
+"@bazel/rollup@5.8.1":
+ version "5.8.1"
+ resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-5.8.1.tgz#ee876c35595b456f700d258385412e4f0dd57c15"
+ integrity sha512-Ys+UWbRp1TY2j+z15N+SZgID/nuqAtJTgJDsz0NZVjm8F8KzmgXxLDnBb/cUKFVk83pNOAi84G/bq1tINjMSNA==
+ dependencies:
+ "@bazel/worker" "5.8.1"
+
+"@bazel/terser@5.8.1":
+ version "5.8.1"
+ resolved "https://registry.yarnpkg.com/@bazel/terser/-/terser-5.8.1.tgz#729a0ec6dcc83e99c4f6d3f2bebb0ff254c10c48"
+ integrity sha512-TPjSDhw1pSZt9P2hd/22IJwl8KCZiJL+u2gB5mghBTCFDVdC5Dgsx135pFtvlqc6LjjOvd3s6dzcQr0YJo2HSg==
+
+"@bazel/typescript@5.8.1":
+ version "5.8.1"
+ resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-5.8.1.tgz#74a76af434fad7930893cf3e98b4cc201e52dc65"
+ integrity sha512-NAJ8WQHZL1WE1YmRoCrq/1hhG15Mvy/viWh6TkvFnBeEhNUiQUsA5GYyhU1ztnBIYW03nATO3vwhAEfO7Q0U5g==
+ dependencies:
+ "@bazel/worker" "5.8.1"
+ semver "5.6.0"
+ source-map-support "0.5.9"
+ tsutils "3.21.0"
+
+"@bazel/worker@5.8.1":
+ version "5.8.1"
+ resolved "https://registry.yarnpkg.com/@bazel/worker/-/worker-5.8.1.tgz#65af7a70dd2f1aaedd6c19330abd9a198f96e7b2"
+ integrity sha512-GMyZSNW3F34f9GjbJqvs1aHyed5BNrNeiDzNJhC1fIizo/UeBM21oBBONIYLBDoBtq936U85VyPZ76JaP/83hw==
+ dependencies:
+ google-protobuf "^3.6.1"
+
+"@bundled-es-modules/cookie@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz"
+ integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==
+ dependencies:
+ cookie "^0.5.0"
+
+"@bundled-es-modules/statuses@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz"
+ integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==
+ dependencies:
+ statuses "^2.0.1"
+
+"@bundled-es-modules/tough-cookie@^0.1.6":
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz"
+ integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==
+ dependencies:
+ "@types/tough-cookie" "^4.0.5"
+ tough-cookie "^4.1.4"
+
+"@esbuild/aix-ppc64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353"
+ integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==
+
+"@esbuild/android-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018"
+ integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==
+
+"@esbuild/android-arm@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee"
+ integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==
+
+"@esbuild/android-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517"
+ integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==
+
+"@esbuild/darwin-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz"
+ integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==
+
+"@esbuild/darwin-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931"
+ integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==
+
+"@esbuild/freebsd-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc"
+ integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==
+
+"@esbuild/freebsd-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730"
+ integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==
+
+"@esbuild/linux-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383"
+ integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==
+
+"@esbuild/linux-arm@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771"
+ integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==
+
+"@esbuild/linux-ia32@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333"
+ integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==
+
+"@esbuild/linux-loong64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac"
+ integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==
+
+"@esbuild/linux-mips64el@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6"
+ integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==
+
+"@esbuild/linux-ppc64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96"
+ integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==
+
+"@esbuild/linux-riscv64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7"
+ integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==
+
+"@esbuild/linux-s390x@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f"
+ integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==
+
+"@esbuild/linux-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24"
+ integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==
+
+"@esbuild/netbsd-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653"
+ integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==
+
+"@esbuild/openbsd-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7"
+ integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==
+
+"@esbuild/openbsd-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273"
+ integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==
+
+"@esbuild/sunos-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403"
+ integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==
+
+"@esbuild/win32-arm64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2"
+ integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==
+
+"@esbuild/win32-ia32@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac"
+ integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==
+
+"@esbuild/win32-x64@0.23.1":
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699"
+ integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0":
+ version "4.11.0"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz"
+ integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==
+
+"@eslint/config-array@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz"
+ integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==
+ dependencies:
+ "@eslint/object-schema" "^2.1.4"
+ debug "^4.3.1"
+ minimatch "^3.1.2"
+
+"@eslint/eslintrc@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz"
+ integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^10.0.1"
+ globals "^14.0.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@9.10.0", "@eslint/js@^9.8.0":
+ version "9.10.0"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz"
+ integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==
+
+"@eslint/object-schema@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz"
+ integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==
+
+"@eslint/plugin-kit@^0.1.0":
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz"
+ integrity sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==
+ dependencies:
+ levn "^0.4.1"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz"
+ integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
+
+"@improbable-eng/grpc-web@^0.15.0":
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.15.0.tgz#3e47e9fdd90381a74abd4b7d26e67422a2a04bef"
+ integrity sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==
+ dependencies:
+ browser-headers "^0.4.1"
+
+"@inquirer/confirm@^3.0.0":
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz"
+ integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==
+ dependencies:
+ "@inquirer/core" "^9.1.0"
+ "@inquirer/type" "^1.5.3"
+
+"@inquirer/core@^9.1.0":
+ version "9.2.1"
+ resolved "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz"
+ integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==
+ dependencies:
+ "@inquirer/figures" "^1.0.6"
+ "@inquirer/type" "^2.0.0"
+ "@types/mute-stream" "^0.0.4"
+ "@types/node" "^22.5.5"
+ "@types/wrap-ansi" "^3.0.0"
+ ansi-escapes "^4.3.2"
+ cli-width "^4.1.0"
+ mute-stream "^1.0.0"
+ signal-exit "^4.1.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^6.2.0"
+ yoctocolors-cjs "^2.1.2"
+
+"@inquirer/figures@^1.0.6":
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz"
+ integrity sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==
+
+"@inquirer/type@^1.5.3":
+ version "1.5.5"
+ resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz"
+ integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==
+ dependencies:
+ mute-stream "^1.0.0"
+
+"@inquirer/type@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz"
+ integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==
+ dependencies:
+ mute-stream "^1.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@mapbox/node-pre-gyp@^1.0.5":
+ version "1.0.11"
+ resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz"
+ integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==
+ dependencies:
+ detect-libc "^2.0.0"
+ https-proxy-agent "^5.0.0"
+ make-dir "^3.1.0"
+ node-fetch "^2.6.7"
+ nopt "^5.0.0"
+ npmlog "^5.0.1"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.11"
+
+"@mswjs/interceptors@^0.35.6":
+ version "0.35.6"
+ resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.6.tgz"
+ integrity sha512-PpD687w7qLxVMK176bpQjbzU9O0VC75QnBK5U1lKd29s4hIuxfTItUD6raNKyQ6BN8b64/8HE34RuYTkwH9uPQ==
+ dependencies:
+ "@open-draft/deferred-promise" "^2.2.0"
+ "@open-draft/logger" "^0.3.0"
+ "@open-draft/until" "^2.0.0"
+ is-node-process "^1.2.0"
+ outvariant "^1.4.3"
+ strict-event-emitter "^0.5.1"
+
+"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3":
+ version "2.1.8-no-fsevents.3"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b"
+ integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@open-draft/deferred-promise@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz"
+ integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==
+
+"@open-draft/logger@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz"
+ integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==
+ dependencies:
+ is-node-process "^1.2.0"
+ outvariant "^1.4.0"
+
+"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz"
+ integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==
+
+"@pkgr/core@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz"
+ integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
+
+"@rollup/pluginutils@^4.0.0":
+ version "4.2.1"
+ resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz"
+ integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
+ dependencies:
+ estree-walker "^2.0.1"
+ picomatch "^2.2.2"
+
+"@sindresorhus/is@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
+"@sindresorhus/merge-streams@^2.1.0":
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz"
+ integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
+
+"@types/cookie@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz"
+ integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==
+
+"@types/eslint@*", "@types/eslint@^9.6.0":
+ version "9.6.1"
+ resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz"
+ integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/eslint__js@^8.42.3":
+ version "8.42.3"
+ resolved "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz"
+ integrity sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==
+ dependencies:
+ "@types/eslint" "*"
+
+"@types/estree@*":
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/fnv-plus@^1.3.2":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@types/fnv-plus/-/fnv-plus-1.3.2.tgz#bd591c1031ae48a18c99eaa60f659288aea545c0"
+ integrity sha512-Bgr5yn2dph2q8HZKDS002Pob6vaRTRfhqN9E+TOhjKsJvnfZXULPR3ihH8dL5ZjgxbNhqhTn9hijpbAMPtKZzw==
+
+"@types/google-protobuf@^3.15.12":
+ version "3.15.12"
+ resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b"
+ integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==
+
+"@types/json-schema@*":
+ version "7.0.15"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/mute-stream@^0.0.4":
+ version "0.0.4"
+ resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz"
+ integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*", "@types/node@^22.5.5":
+ version "22.5.5"
+ resolved "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz"
+ integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/semver@^7.5.8":
+ version "7.5.8"
+ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz"
+ integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
+
+"@types/statuses@^2.0.4":
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz"
+ integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==
+
+"@types/tough-cookie@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz"
+ integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==
+
+"@types/wrap-ansi@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz"
+ integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==
+
+"@typescript-eslint/eslint-plugin@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz#d0070f206daad26253bf00ca5b80f9b54f9e2dd0"
+ integrity sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==
+ dependencies:
+ "@eslint-community/regexpp" "^4.10.0"
+ "@typescript-eslint/scope-manager" "8.7.0"
+ "@typescript-eslint/type-utils" "8.7.0"
+ "@typescript-eslint/utils" "8.7.0"
+ "@typescript-eslint/visitor-keys" "8.7.0"
+ graphemer "^1.4.0"
+ ignore "^5.3.1"
+ natural-compare "^1.4.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/eslint-plugin@^8.0.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz"
+ integrity sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==
+ dependencies:
+ "@eslint-community/regexpp" "^4.10.0"
+ "@typescript-eslint/scope-manager" "8.6.0"
+ "@typescript-eslint/type-utils" "8.6.0"
+ "@typescript-eslint/utils" "8.6.0"
+ "@typescript-eslint/visitor-keys" "8.6.0"
+ graphemer "^1.4.0"
+ ignore "^5.3.1"
+ natural-compare "^1.4.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/parser@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.7.0.tgz#a567b0890d13db72c7348e1d88442ea8ab4e9173"
+ integrity sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==
+ dependencies:
+ "@typescript-eslint/scope-manager" "8.7.0"
+ "@typescript-eslint/types" "8.7.0"
+ "@typescript-eslint/typescript-estree" "8.7.0"
+ "@typescript-eslint/visitor-keys" "8.7.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/parser@^8.0.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz"
+ integrity sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==
+ dependencies:
+ "@typescript-eslint/scope-manager" "8.6.0"
+ "@typescript-eslint/types" "8.6.0"
+ "@typescript-eslint/typescript-estree" "8.6.0"
+ "@typescript-eslint/visitor-keys" "8.6.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz"
+ integrity sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==
+ dependencies:
+ "@typescript-eslint/types" "8.6.0"
+ "@typescript-eslint/visitor-keys" "8.6.0"
+
+"@typescript-eslint/scope-manager@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz#90ee7bf9bc982b9260b93347c01a8bc2b595e0b8"
+ integrity sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==
+ dependencies:
+ "@typescript-eslint/types" "8.7.0"
+ "@typescript-eslint/visitor-keys" "8.7.0"
+
+"@typescript-eslint/type-utils@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz"
+ integrity sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "8.6.0"
+ "@typescript-eslint/utils" "8.6.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/type-utils@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz#d56b104183bdcffcc434a23d1ce26cde5e42df93"
+ integrity sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "8.7.0"
+ "@typescript-eslint/utils" "8.7.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/types@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz"
+ integrity sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==
+
+"@typescript-eslint/types@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.7.0.tgz#21d987201c07b69ce7ddc03451d7196e5445ad19"
+ integrity sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==
+
+"@typescript-eslint/typescript-estree@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz"
+ integrity sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==
+ dependencies:
+ "@typescript-eslint/types" "8.6.0"
+ "@typescript-eslint/visitor-keys" "8.6.0"
+ debug "^4.3.4"
+ fast-glob "^3.3.2"
+ is-glob "^4.0.3"
+ minimatch "^9.0.4"
+ semver "^7.6.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/typescript-estree@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz#6c7db6baa4380b937fa81466c546d052f362d0e8"
+ integrity sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==
+ dependencies:
+ "@typescript-eslint/types" "8.7.0"
+ "@typescript-eslint/visitor-keys" "8.7.0"
+ debug "^4.3.4"
+ fast-glob "^3.3.2"
+ is-glob "^4.0.3"
+ minimatch "^9.0.4"
+ semver "^7.6.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/utils@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz"
+ integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@typescript-eslint/scope-manager" "8.6.0"
+ "@typescript-eslint/types" "8.6.0"
+ "@typescript-eslint/typescript-estree" "8.6.0"
+
+"@typescript-eslint/utils@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.7.0.tgz#cef3f70708b5b5fd7ed8672fc14714472bd8a011"
+ integrity sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@typescript-eslint/scope-manager" "8.7.0"
+ "@typescript-eslint/types" "8.7.0"
+ "@typescript-eslint/typescript-estree" "8.7.0"
+
+"@typescript-eslint/visitor-keys@8.6.0":
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz"
+ integrity sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==
+ dependencies:
+ "@typescript-eslint/types" "8.6.0"
+ eslint-visitor-keys "^3.4.3"
+
+"@typescript-eslint/visitor-keys@8.7.0":
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz#5e46f1777f9d69360a883c1a56ac3c511c9659a8"
+ integrity sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==
+ dependencies:
+ "@typescript-eslint/types" "8.7.0"
+ eslint-visitor-keys "^3.4.3"
+
+"@vercel/nft@^0.26.2":
+ version "0.26.5"
+ resolved "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.5.tgz"
+ integrity sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==
+ dependencies:
+ "@mapbox/node-pre-gyp" "^1.0.5"
+ "@rollup/pluginutils" "^4.0.0"
+ acorn "^8.6.0"
+ acorn-import-attributes "^1.9.2"
+ async-sema "^3.1.1"
+ bindings "^1.4.0"
+ estree-walker "2.0.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.2"
+ node-gyp-build "^4.2.2"
+ resolve-from "^5.0.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+acorn-import-attributes@^1.9.2:
+ version "1.9.5"
+ resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz"
+ integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.3.2:
+ version "8.3.4"
+ resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz"
+ integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==
+ dependencies:
+ acorn "^8.11.0"
+
+acorn@^8.11.0, acorn@^8.11.3, acorn@^8.12.0, acorn@^8.6.0:
+ version "8.12.1"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+adm-zip@^0.5.10:
+ version "0.5.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909"
+ integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.0.0, ansi-styles@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz"
+ integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+"aproba@^1.0.3 || ^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz"
+ integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
+arch@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz"
+ integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
+
+archive-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
+ integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==
+ dependencies:
+ file-type "^4.2.0"
+
+are-we-there-yet@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz"
+ integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz"
+ integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz"
+ integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz"
+ integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz"
+ integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz"
+ integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz"
+ integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
+
+arrgv@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz"
+ integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==
+
+arrify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz"
+ integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"
+ integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
+async-each@^1.0.0:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz"
+ integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==
+
+async-sema@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz"
+ integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+ava@6.1.3:
+ version "6.1.3"
+ resolved "https://registry.npmjs.org/ava/-/ava-6.1.3.tgz"
+ integrity sha512-tkKbpF1pIiC+q09wNU9OfyTDYZa8yuWvU2up3+lFJ3lr1RmnYh2GBpPwzYUEB0wvTPIUysGjcZLNZr7STDviRA==
+ dependencies:
+ "@vercel/nft" "^0.26.2"
+ acorn "^8.11.3"
+ acorn-walk "^8.3.2"
+ ansi-styles "^6.2.1"
+ arrgv "^1.0.2"
+ arrify "^3.0.0"
+ callsites "^4.1.0"
+ cbor "^9.0.1"
+ chalk "^5.3.0"
+ chunkd "^2.0.1"
+ ci-info "^4.0.0"
+ ci-parallel-vars "^1.0.1"
+ cli-truncate "^4.0.0"
+ code-excerpt "^4.0.0"
+ common-path-prefix "^3.0.0"
+ concordance "^5.0.4"
+ currently-unhandled "^0.4.1"
+ debug "^4.3.4"
+ emittery "^1.0.1"
+ figures "^6.0.1"
+ globby "^14.0.0"
+ ignore-by-default "^2.1.0"
+ indent-string "^5.0.0"
+ is-plain-object "^5.0.0"
+ is-promise "^4.0.0"
+ matcher "^5.0.0"
+ memoize "^10.0.0"
+ ms "^2.1.3"
+ p-map "^7.0.1"
+ package-config "^5.0.0"
+ picomatch "^3.0.1"
+ plur "^5.1.0"
+ pretty-ms "^9.0.0"
+ resolve-cwd "^3.0.0"
+ stack-utils "^2.0.6"
+ strip-ansi "^7.1.0"
+ supertap "^3.0.1"
+ temp-dir "^3.0.0"
+ write-file-atomic "^5.0.1"
+ yargs "^17.7.2"
+
+babel-plugin-polyfill-corejs2@^0.4.10:
+ version "0.4.11"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
+ integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.10.4:
+ version "0.10.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+ integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ core-js-compat "^3.38.0"
+
+babel-plugin-polyfill-regenerator@^0.6.1:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
+ integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+
+babel-runtime@^6.9.2:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
+ integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+bail@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+bindings@^1.4.0, bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bl@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+ integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+ dependencies:
+ readable-stream "^2.3.5"
+ safe-buffer "^5.1.1"
+
+blessed@^0.1.81:
+ version "0.1.81"
+ resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz"
+ integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==
+
+blueimp-md5@^2.10.0:
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz"
+ integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz"
+ integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browser-headers@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02"
+ integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==
+
+browserslist@^4.23.3, browserslist@^4.24.0:
+ version "4.24.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4"
+ integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
+ dependencies:
+ caniuse-lite "^1.0.30001663"
+ electron-to-chromium "^1.5.28"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^5.2.1:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+ integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==
+ dependencies:
+ clone-response "1.0.2"
+ get-stream "3.0.0"
+ http-cache-semantics "3.8.1"
+ keyv "3.0.0"
+ lowercase-keys "1.0.0"
+ normalize-url "2.0.1"
+ responselike "1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+callsites@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz"
+ integrity sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30001663:
+ version "1.0.30001669"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3"
+ integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==
+
+cbor@^9.0.1:
+ version "9.0.2"
+ resolved "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz"
+ integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==
+ dependencies:
+ nofilter "^3.1.0"
+
+ccount@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz"
+ integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
+
+chalk@2.4.2, chalk@^2.3.2, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz"
+ integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
+
+character-entities-html4@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz"
+ integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+chokidar@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz"
+ integrity sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+chokidar@^3.4.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chunkd@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz"
+ integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==
+
+ci-info@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz"
+ integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==
+
+ci-parallel-vars@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz"
+ integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-clear@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/cli-clear/-/cli-clear-1.0.4.tgz"
+ integrity sha512-/WdwW67j4CO5PHQtd7+qisNNxHxbAcuq3s9T64pz3hiToFPHRpkv+3YdwOPKQlk8twroU76feyHmJHjJ0K2p6w==
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-truncate@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz"
+ integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==
+ dependencies:
+ slice-ansi "^5.0.0"
+ string-width "^7.0.0"
+
+cli-width@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz"
+ integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
+cli-width@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz"
+ integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==
+
+clipboardy@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz"
+ integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==
+ dependencies:
+ arch "^2.1.1"
+ execa "^1.0.0"
+ is-wsl "^2.1.1"
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+clone-response@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
+ dependencies:
+ mimic-response "^1.0.0"
+
+code-excerpt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz"
+ integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==
+ dependencies:
+ convert-to-spaces "^2.0.1"
+
+collapse-white-space@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz"
+ integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"
+ integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-support@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+commander@^2.8.1:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+ integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
+common-path-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz"
+ integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==
+
+component-emitter@^1.2.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz"
+ integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concordance@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz"
+ integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==
+ dependencies:
+ date-time "^3.1.0"
+ esutils "^2.0.3"
+ fast-diff "^1.2.0"
+ js-string-escape "^1.0.1"
+ lodash "^4.17.15"
+ md5-hex "^3.0.1"
+ semver "^7.3.2"
+ well-known-symbols "^2.0.0"
+
+console-control-strings@^1.0.0, console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
+content-disposition@^0.5.2:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+convert-to-spaces@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz"
+ integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==
+
+cookie@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz"
+ integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
+
+core-js-compat@^3.37.1, core-js-compat@^3.38.0:
+ version "3.38.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09"
+ integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==
+ dependencies:
+ browserslist "^4.23.3"
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cpx@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz"
+ integrity sha512-jHTjZhsbg9xWgsP2vuNW2jnnzBX+p4T+vNI9Lbjzs1n4KhOfa22bQppiFYLsWQKd8TzmL5aSP/Me3yfsCwXbDA==
+ dependencies:
+ babel-runtime "^6.9.2"
+ chokidar "^1.6.0"
+ duplexer "^0.1.1"
+ glob "^7.0.5"
+ glob2base "^0.0.12"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ resolve "^1.1.7"
+ safe-buffer "^5.0.1"
+ shell-quote "^1.6.1"
+ subarg "^1.0.0"
+
+cross-spawn@^6.0.0:
+ version "6.0.5"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz"
+ integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==
+ dependencies:
+ array-find-index "^1.0.1"
+
+date-time@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz"
+ integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==
+ dependencies:
+ time-zone "^1.0.0"
+
+dateformat@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz"
+ integrity sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+ integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+ dependencies:
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+ tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+ integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+ dependencies:
+ decompress-tar "^4.1.0"
+ file-type "^6.1.0"
+ is-stream "^1.1.0"
+ seek-bzip "^1.0.5"
+ unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+ integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+ dependencies:
+ decompress-tar "^4.1.1"
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+ integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==
+ dependencies:
+ file-type "^3.8.0"
+ get-stream "^2.2.0"
+ pify "^2.3.0"
+ yauzl "^2.4.2"
+
+decompress@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118"
+ integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==
+ dependencies:
+ decompress-tar "^4.0.0"
+ decompress-tarbz2 "^4.0.0"
+ decompress-targz "^4.0.0"
+ decompress-unzip "^4.0.1"
+ graceful-fs "^4.1.10"
+ make-dir "^1.0.0"
+ pify "^2.3.0"
+ strip-dirs "^2.0.0"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz"
+ integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz"
+ integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+detect-libc@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+download@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/download/-/download-8.0.0.tgz#afc0b309730811731aae9f5371c9f46be73e51b1"
+ integrity sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==
+ dependencies:
+ archive-type "^4.0.0"
+ content-disposition "^0.5.2"
+ decompress "^4.2.1"
+ ext-name "^5.0.0"
+ file-type "^11.1.0"
+ filenamify "^3.0.0"
+ get-stream "^4.1.0"
+ got "^8.3.1"
+ make-dir "^2.1.0"
+ p-event "^2.1.0"
+ pify "^4.0.1"
+
+duplexer3@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e"
+ integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==
+
+duplexer@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+electron-to-chromium@^1.5.28:
+ version "1.5.41"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz#eae1ba6c49a1a61d84cf8263351d3513b2bcc534"
+ integrity sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==
+
+emittery@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz"
+ integrity sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==
+
+emoji-regex@^10.3.0:
+ version "10.4.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz"
+ integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+esbuild@~0.23.0:
+ version "0.23.1"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz"
+ integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.23.1"
+ "@esbuild/android-arm" "0.23.1"
+ "@esbuild/android-arm64" "0.23.1"
+ "@esbuild/android-x64" "0.23.1"
+ "@esbuild/darwin-arm64" "0.23.1"
+ "@esbuild/darwin-x64" "0.23.1"
+ "@esbuild/freebsd-arm64" "0.23.1"
+ "@esbuild/freebsd-x64" "0.23.1"
+ "@esbuild/linux-arm" "0.23.1"
+ "@esbuild/linux-arm64" "0.23.1"
+ "@esbuild/linux-ia32" "0.23.1"
+ "@esbuild/linux-loong64" "0.23.1"
+ "@esbuild/linux-mips64el" "0.23.1"
+ "@esbuild/linux-ppc64" "0.23.1"
+ "@esbuild/linux-riscv64" "0.23.1"
+ "@esbuild/linux-s390x" "0.23.1"
+ "@esbuild/linux-x64" "0.23.1"
+ "@esbuild/netbsd-x64" "0.23.1"
+ "@esbuild/openbsd-arm64" "0.23.1"
+ "@esbuild/openbsd-x64" "0.23.1"
+ "@esbuild/sunos-x64" "0.23.1"
+ "@esbuild/win32-arm64" "0.23.1"
+ "@esbuild/win32-ia32" "0.23.1"
+ "@esbuild/win32-x64" "0.23.1"
+
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escape-string-regexp@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz"
+ integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+
+eslint-config-prettier@9.1.0:
+ version "9.1.0"
+ resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz"
+ integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
+
+eslint-plugin-prettier@5.2.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz"
+ integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+ synckit "^0.9.1"
+
+eslint-scope@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz"
+ integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz"
+ integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
+
+eslint@^9.8.0:
+ version "9.10.0"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz"
+ integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.11.0"
+ "@eslint/config-array" "^0.18.0"
+ "@eslint/eslintrc" "^3.1.0"
+ "@eslint/js" "9.10.0"
+ "@eslint/plugin-kit" "^0.1.0"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.3.0"
+ "@nodelib/fs.walk" "^1.2.8"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^8.0.2"
+ eslint-visitor-keys "^4.0.0"
+ espree "^10.1.0"
+ esquery "^1.5.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+espree@^10.0.1, espree@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz"
+ integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==
+ dependencies:
+ acorn "^8.12.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^4.0.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estree-walker@2.0.2, estree-walker@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2, esutils@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz"
+ integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"
+ integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz"
+ integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==
+ dependencies:
+ fill-range "^2.1.0"
+
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
+ integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"
+ integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+external-editor@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz"
+ integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz"
+ integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==
+ dependencies:
+ is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2, fast-diff@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^3.2.9, fast-glob@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
+figures@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+figures@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz"
+ integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==
+ dependencies:
+ is-unicode-supported "^2.0.0"
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+file-type@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8"
+ integrity sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==
+
+file-type@^3.8.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
+
+file-type@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+ integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==
+
+file-type@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+ integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==
+
+file-type@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+ integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz"
+ integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==
+
+filename-reserved-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
+ integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==
+
+filenamify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-3.0.0.tgz#9603eb688179f8c5d40d828626dcbb92c3a4672c"
+ integrity sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==
+ dependencies:
+ filename-reserved-regex "^2.0.0"
+ strip-outer "^1.0.0"
+ trim-repeated "^1.0.0"
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz"
+ integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz"
+ integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-index@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz"
+ integrity sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==
+
+find-up-simple@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz"
+ integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==
+
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+fnv-plus@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67"
+ integrity sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==
+
+for-in@^1.0.1, for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
+ integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz"
+ integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==
+ dependencies:
+ for-in "^1.0.1"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
+ integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
+ dependencies:
+ map-cache "^0.2.2"
+
+from2@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs-readdir-recursive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
+ integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^1.0.0:
+ version "1.2.13"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gauge@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz"
+ integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.2"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.1"
+ object-assign "^4.1.1"
+ signal-exit "^3.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.2"
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-east-asian-width@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz"
+ integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==
+
+get-stream@3.0.0, get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
+
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^4.0.0, get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-tsconfig@^4.7.5:
+ version "4.8.1"
+ resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz"
+ integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==
+ dependencies:
+ resolve-pkg-maps "^1.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"
+ integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz"
+ integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz"
+ integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==
+ dependencies:
+ is-glob "^2.0.0"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob2base@^0.0.12:
+ version "0.0.12"
+ resolved "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz"
+ integrity sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==
+ dependencies:
+ find-index "^0.1.1"
+
+glob@^7.0.5, glob@^7.1.3, glob@^7.2.0:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
+ integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+
+globby@^11.0.0:
+ version "11.1.0"
+ resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+globby@^14.0.0:
+ version "14.0.2"
+ resolved "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz"
+ integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==
+ dependencies:
+ "@sindresorhus/merge-streams" "^2.1.0"
+ fast-glob "^3.3.2"
+ ignore "^5.2.4"
+ path-type "^5.0.0"
+ slash "^5.1.0"
+ unicorn-magic "^0.1.0"
+
+google-protobuf@3.14.0:
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.14.0.tgz#20373d22046e63831a5110e11a84f713cc43651e"
+ integrity sha512-bwa8dBuMpOxg7COyqkW6muQuvNnWgVN8TX/epDRGW5m0jcrmq2QJyCyiV8ZE2/6LaIIqJtiv9bYokFhfpy/o6w==
+
+google-protobuf@^3.15.5, google-protobuf@^3.6.1:
+ version "3.21.4"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9"
+ integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==
+
+got@^8.3.1:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+ integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+ dependencies:
+ "@sindresorhus/is" "^0.7.0"
+ cacheable-request "^2.1.1"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ into-stream "^3.1.0"
+ is-retry-allowed "^1.1.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ mimic-response "^1.0.0"
+ p-cancelable "^0.4.0"
+ p-timeout "^2.0.1"
+ pify "^3.0.0"
+ safe-buffer "^5.1.1"
+ timed-out "^4.0.1"
+ url-parse-lax "^3.0.0"
+ url-to-options "^1.0.1"
+
+graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+graphql@^16.8.1:
+ version "16.9.0"
+ resolved "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz"
+ integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"
+ integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz"
+ integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz"
+ integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz"
+ integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hasown@^2.0.0, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+headers-polyfill@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz"
+ integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==
+
+http-cache-semantics@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+ integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore-by-default@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz"
+ integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==
+
+ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz"
+ integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inquirer@^7.1.0:
+ version "7.3.3"
+ resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz"
+ integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ chalk "^4.1.0"
+ cli-cursor "^3.1.0"
+ cli-width "^3.0.0"
+ external-editor "^3.0.3"
+ figures "^3.0.0"
+ lodash "^4.17.19"
+ mute-stream "0.0.8"
+ run-async "^2.4.0"
+ rxjs "^6.6.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+ through "^2.3.6"
+
+into-stream@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+ integrity sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==
+ dependencies:
+ from2 "^2.1.1"
+ p-is-promise "^1.1.0"
+
+irregular-plurals@^3.3.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz"
+ integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==
+
+is-accessor-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz"
+ integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
+ dependencies:
+ hasown "^2.0.0"
+
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumeric@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz"
+ integrity sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+ integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-buffer@^1.1.4, is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-core-module@^2.13.0:
+ version "2.15.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz"
+ integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-descriptor@^0.1.0:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz"
+ integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz"
+ integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz"
+ integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"
+ integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
+ integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-fullwidth-code-point@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz"
+ integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
+ integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-natural-number@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+ integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==
+
+is-node-process@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz"
+ integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz"
+ integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz"
+ integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz"
+ integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
+ integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
+ integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
+ integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==
+
+is-promise@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz"
+ integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
+
+is-retry-allowed@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
+ integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
+
+is-unicode-supported@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz"
+ integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==
+
+is-whitespace-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz"
+ integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-word-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz"
+ integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz"
+ integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+jpeg-exif@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz"
+ integrity sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==
+
+js-string-escape@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz"
+ integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.14.1:
+ version "3.14.1"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2, jsesc@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+keyv@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+ integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+ dependencies:
+ json-buffer "3.0.0"
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz"
+ integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+load-json-file@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz"
+ integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@^4.17.15, lodash@^4.17.19:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+longest-streak@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz"
+ integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
+
+lowercase-keys@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+ integrity sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
+make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz"
+ integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"
+ integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown-escapes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz"
+ integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+
+markdown-table@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz"
+ integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==
+
+matcher@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz"
+ integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==
+ dependencies:
+ escape-string-regexp "^5.0.0"
+
+math-random@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz"
+ integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
+
+md5-hex@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz"
+ integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==
+ dependencies:
+ blueimp-md5 "^2.10.0"
+
+mdast-util-compact@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz"
+ integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==
+ dependencies:
+ unist-util-visit "^1.1.0"
+
+memoize@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz"
+ integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==
+ dependencies:
+ mimic-function "^5.0.0"
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz"
+ integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+micromatch@^3.1.10:
+ version "3.1.10"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.2, micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@^1.28.0:
+ version "1.53.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+ integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-function@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz"
+ integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+minimatch@3.0.5:
+ version "3.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz"
+ integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.2, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.1.0, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^3.0.0:
+ version "3.3.6"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.1:
+ version "0.5.6"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+msw@^2.3.5:
+ version "2.4.8"
+ resolved "https://registry.npmjs.org/msw/-/msw-2.4.8.tgz"
+ integrity sha512-a+FUW1m5yT8cV9GBy0L/cbNg0EA4//SKEzgu3qFrpITrWYeZmqfo7dqtM74T2lAl69jjUjjCaEhZKaxG2Ns8DA==
+ dependencies:
+ "@bundled-es-modules/cookie" "^2.0.0"
+ "@bundled-es-modules/statuses" "^1.0.1"
+ "@bundled-es-modules/tough-cookie" "^0.1.6"
+ "@inquirer/confirm" "^3.0.0"
+ "@mswjs/interceptors" "^0.35.6"
+ "@open-draft/until" "^2.1.0"
+ "@types/cookie" "^0.6.0"
+ "@types/statuses" "^2.0.4"
+ chalk "^4.1.2"
+ graphql "^16.8.1"
+ headers-polyfill "^4.0.2"
+ is-node-process "^1.2.0"
+ outvariant "^1.4.2"
+ path-to-regexp "^6.3.0"
+ strict-event-emitter "^0.5.1"
+ type-fest "^4.9.0"
+ yargs "^17.7.2"
+
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+mute-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz"
+ integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
+
+named-js-regexp@^1.3.3:
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz"
+ integrity sha512-XO0DPujDP9IWpkt690iWLreKztb/VB811DGl5N3z7BfhkMJuiVZXOi6YN/fEB9qkvtMVTgSZDW8pzdVt8vj/FA==
+
+nan@^2.12.1:
+ version "2.20.0"
+ resolved "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz"
+ integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-fetch@^2.6.7:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp-build@^4.2.2:
+ version "4.8.2"
+ resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz"
+ integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==
+
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+nofilter@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz"
+ integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==
+
+nopt@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz"
+ integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+ dependencies:
+ abbrev "1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz"
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+ integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+ dependencies:
+ prepend-http "^2.0.0"
+ query-string "^5.0.1"
+ sort-keys "^2.0.0"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz"
+ integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz"
+ integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+ dependencies:
+ are-we-there-yet "^2.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^3.0.0"
+ set-blocking "^2.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz"
+ integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz"
+ integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz"
+ integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
+ dependencies:
+ isobject "^3.0.0"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz"
+ integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz"
+ integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+opn@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz"
+ integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+ dependencies:
+ is-wsl "^1.1.0"
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz"
+ integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==
+
+p-cancelable@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+ integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-event@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
+ integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
+ dependencies:
+ p-timeout "^2.0.1"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"
+ integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+
+p-is-promise@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+ integrity sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^7.0.1:
+ version "7.0.2"
+ resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz"
+ integrity sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==
+
+p-timeout@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+ integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+package-config@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz"
+ integrity sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==
+ dependencies:
+ find-up-simple "^1.0.0"
+ load-json-file "^7.0.1"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-entities@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz"
+ integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz"
+ integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-ms@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz"
+ integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz"
+ integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz"
+ integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+path-type@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz"
+ integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
+picocolors@^1.0.0, picocolors@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+picomatch@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz"
+ integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==
+
+pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
+plur@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz"
+ integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==
+ dependencies:
+ irregular-plurals "^3.3.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz"
+ integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz"
+ integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==
+
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@3.3.3:
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz"
+ integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
+
+pretty-ms@^9.0.0:
+ version "9.1.0"
+ resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz"
+ integrity sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==
+ dependencies:
+ parse-ms "^4.0.0"
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+prompt-sync@^4.1.6:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz"
+ integrity sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==
+ dependencies:
+ strip-ansi "^5.0.0"
+
+protoc-gen-js@^3.21.2:
+ version "3.21.2"
+ resolved "https://registry.yarnpkg.com/protoc-gen-js/-/protoc-gen-js-3.21.2.tgz#d92f37cb8ebf4403656515ab424983c77f07a804"
+ integrity sha512-nSpiXulygg0vUv05uFeATuZSbgMQMeoef0BhB5266Y6HmsqVtIrbSkK/Z2Yk0KLE+BirRNjsTKDUJxg3OPO9pQ==
+ dependencies:
+ adm-zip "^0.5.10"
+ download "^8.0.0"
+
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+randomatic@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz"
+ integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.3.0, readable-stream@^2.3.5:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate-unicode-properties@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0"
+ integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz"
+ integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac"
+ integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==
+ dependencies:
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.2.0"
+ regjsgen "^0.8.0"
+ regjsparser "^0.11.0"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.1.0"
+
+regjsgen@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
+ integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
+
+regjsparser@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149"
+ integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==
+ dependencies:
+ jsesc "~3.0.2"
+
+remark-parse@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz"
+ integrity sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==
+ dependencies:
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^1.0.2"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^1.0.0"
+ vfile-location "^2.0.0"
+ xtend "^4.0.1"
+
+remark-stringify@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz"
+ integrity sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==
+ dependencies:
+ ccount "^1.0.0"
+ is-alphanumeric "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ longest-streak "^2.0.1"
+ markdown-escapes "^1.0.0"
+ markdown-table "^1.1.0"
+ mdast-util-compact "^1.0.0"
+ parse-entities "^1.0.2"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ stringify-entities "^1.0.1"
+ unherit "^1.0.4"
+ xtend "^4.0.1"
+
+remark@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz"
+ integrity sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==
+ dependencies:
+ remark-parse "^4.0.0"
+ remark-stringify "^4.0.0"
+ unified "^6.0.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+rename-cli@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/rename-cli/-/rename-cli-6.2.1.tgz"
+ integrity sha512-9UV1/tEEEtMKH54T6GCjo+VGXBbSMqTCzbXeB3AXJrK5JImxEpSRrUnKNGu+ByGwCqnXqOPirkiRApedLQC8Lg==
+ dependencies:
+ blessed "^0.1.81"
+ chalk "^2.3.2"
+ cli-clear "^1.0.4"
+ clipboardy "^2.2.0"
+ dateformat "^2.2.0"
+ fs-extra "^8.1.0"
+ globby "^11.0.0"
+ inquirer "^7.1.0"
+ jpeg-exif "^1.1.4"
+ named-js-regexp "^1.3.3"
+ num2fraction "^1.2.2"
+ opn "^5.3.0"
+ path-exists "^3.0.0"
+ prompt-sync "^4.1.6"
+ remark "^8.0.0"
+ yargs "^15.3.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+replace-ext@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz"
+ integrity sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==
+
+replace@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz"
+ integrity sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==
+ dependencies:
+ chalk "2.4.2"
+ minimatch "3.0.5"
+ yargs "^15.3.1"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-pkg-maps@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz"
+ integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
+ integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+resolve@^1.1.7, resolve@^1.14.2:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rxjs@^6.6.0:
+ version "6.6.7"
+ resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
+ integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz"
+ integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+seek-bzip@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
+ integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==
+ dependencies:
+ commander "^2.8.1"
+
+semver@5.6.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+ integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+
+semver@^5.5.0, semver@^5.6.0:
+ version "5.7.2"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.0.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.2, semver@^7.3.5, semver@^7.6.0:
+ version "7.6.3"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.6.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz"
+ integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+signal-exit@^4.0.1, signal-exit@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slash@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz"
+ integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
+
+slice-ansi@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz"
+ integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
+ dependencies:
+ ansi-styles "^6.0.0"
+ is-fullwidth-code-point "^4.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+ integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.9:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+ integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+state-toggle@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz"
+ integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz"
+ integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+statuses@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+strict-event-emitter@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz"
+ integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz"
+ integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==
+ dependencies:
+ emoji-regex "^10.3.0"
+ get-east-asian-width "^1.0.0"
+ strip-ansi "^7.1.0"
+
+string_decoder@^1.1.1, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-entities@^1.0.1:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz"
+ integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==
+ dependencies:
+ character-entities-html4 "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+strip-ansi@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1, strip-ansi@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-dirs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+ integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+ dependencies:
+ is-natural-number "^4.0.1"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz"
+ integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strip-outer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+ integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz"
+ integrity sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==
+ dependencies:
+ minimist "^1.1.0"
+
+supertap@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz"
+ integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==
+ dependencies:
+ indent-string "^5.0.0"
+ js-yaml "^3.14.1"
+ serialize-error "^7.0.1"
+ strip-ansi "^7.0.1"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+synckit@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz"
+ integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==
+ dependencies:
+ "@pkgr/core" "^0.1.0"
+ tslib "^2.6.2"
+
+tar-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+ integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+ dependencies:
+ bl "^1.0.0"
+ buffer-alloc "^1.2.0"
+ end-of-stream "^1.0.0"
+ fs-constants "^1.0.0"
+ readable-stream "^2.3.0"
+ to-buffer "^1.1.1"
+ xtend "^4.0.0"
+
+tar@^6.1.11:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz"
+ integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^5.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+temp-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz"
+ integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+through@^2.3.6, through@^2.3.8:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+time-zone@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz"
+ integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==
+
+timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-buffer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+ integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"
+ integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz"
+ integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+tough-cookie@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+trim-repeated@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+ integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+trim-trailing-lines@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz"
+ integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==
+
+trim@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz"
+ integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==
+
+trough@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+ts-api-utils@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz"
+ integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+
+ts-protoc-gen@0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/ts-protoc-gen/-/ts-protoc-gen-0.15.0.tgz#2fec5930b46def7dcc9fa73c060d770b7b076b7b"
+ integrity sha512-TycnzEyrdVDlATJ3bWFTtra3SCiEP0W0vySXReAuEygXCUr1j2uaVyL0DhzjwuUdQoW5oXPwk6oZWeA0955V+g==
+ dependencies:
+ google-protobuf "^3.15.5"
+
+tslib@^1.8.1, tslib@^1.9.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.6.2:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz"
+ integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+
+tsutils@3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+tsx@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz"
+ integrity sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==
+ dependencies:
+ esbuild "~0.23.0"
+ get-tsconfig "^4.7.5"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^4.9.0:
+ version "4.26.1"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz"
+ integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==
+
+typescript-eslint@^8.7.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.7.0.tgz#6c84f94013a0cc0074da7d639c2644eae20c3171"
+ integrity sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "8.7.0"
+ "@typescript-eslint/parser" "8.7.0"
+ "@typescript-eslint/utils" "8.7.0"
+
+typescript@^5.5.4:
+ version "5.6.2"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz"
+ integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==
+
+unbzip2-stream@^1.0.9:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+unherit@^1.0.4:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz"
+ integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
+ dependencies:
+ inherits "^2.0.0"
+ xtend "^4.0.0"
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"
+ integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
+ integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+ integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+
+unicorn-magic@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz"
+ integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==
+
+unified@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz"
+ integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==
+ dependencies:
+ bail "^1.0.0"
+ extend "^3.0.0"
+ is-plain-obj "^1.1.0"
+ trough "^1.0.0"
+ vfile "^2.0.0"
+ x-is-string "^0.1.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+unist-util-is@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz"
+ integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==
+
+unist-util-remove-position@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz"
+ integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==
+ dependencies:
+ unist-util-visit "^1.1.0"
+
+unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz"
+ integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==
+
+unist-util-visit-parents@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz"
+ integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==
+ dependencies:
+ unist-util-is "^3.0.0"
+
+unist-util-visit@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz"
+ integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==
+ dependencies:
+ unist-util-visit-parents "^2.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz"
+ integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+update-browserslist-db@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
+ integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+vfile-location@^2.0.0:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz"
+ integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==
+
+vfile-message@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz"
+ integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==
+ dependencies:
+ unist-util-stringify-position "^1.1.1"
+
+vfile@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz"
+ integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==
+ dependencies:
+ is-buffer "^1.1.4"
+ replace-ext "1.0.0"
+ unist-util-stringify-position "^1.0.0"
+ vfile-message "^1.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+well-known-symbols@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz"
+ integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-module@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.2:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz"
+ integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^4.0.1"
+
+x-is-string@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz"
+ integrity sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==
+
+xtend@^4.0.0, xtend@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^15.3.0, yargs@^15.3.1:
+ version "15.4.1"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yauzl@^2.4.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yoctocolors-cjs@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz"
+ integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==
diff --git a/hack/create-account/README.md b/hack/create-account/README.md
index 652ce39819..85deea1f70 100644
--- a/hack/create-account/README.md
+++ b/hack/create-account/README.md
@@ -7,7 +7,7 @@ go run ./hack/create-account create \
--service-token=full-path-to-service-token-file \
--email=email \
--role=role \
- --environment-namespace=environment-namespace \
+ --environment-id=environment-id \
--is-admin(optional) \
--no-profile \
--no-gcp-trace-enabled
diff --git a/hack/create-account/command.go b/hack/create-account/command.go
index 4aa9895dd8..ff991eec1b 100644
--- a/hack/create-account/command.go
+++ b/hack/create-account/command.go
@@ -32,13 +32,13 @@ import (
type command struct {
*kingpin.CmdClause
- certPath *string
- serviceTokenPath *string
- webGatewayAddress *string
- email *string
- role *string
- environmentNamespace *string
- organizationID *string
+ certPath *string
+ serviceTokenPath *string
+ webGatewayAddress *string
+ email *string
+ role *string
+ environmentID *string
+ organizationID *string
}
func registerCommand(r cli.CommandRegistry, p cli.ParentCommand) *command {
@@ -50,9 +50,9 @@ func registerCommand(r cli.CommandRegistry, p cli.ParentCommand) *command {
webGatewayAddress: cmd.Flag("web-gateway", "Address of web-gateway.").Required().String(),
email: cmd.Flag("email", "The email of an account.").Required().String(),
role: cmd.Flag("role", "The role of an environment.").Required().Enum("VIEWER", "EDITOR"),
- environmentNamespace: cmd.Flag(
- "environment-namespace",
- "The environment namespace for Datestore namespace",
+ environmentID: cmd.Flag(
+ "environment-id",
+ "The environment id for Datestore namespace",
).Required().String(),
organizationID: cmd.Flag("organization-id", "The organization id").Required().String(),
}
@@ -74,7 +74,7 @@ func (c *command) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.
err = c.createAccount(ctx, client, accountproto.AccountV2_Role_Environment(role))
if err != nil {
logger.Error("Failed to create account", zap.Error(err),
- zap.String("environmentNamespace", *c.environmentNamespace))
+ zap.String("environmentId", *c.environmentID))
return err
}
logger.Info("Account created")
@@ -88,7 +88,7 @@ func (c *command) createAccount(
) error {
envRoles := []*accountproto.AccountV2_EnvironmentRole{
{
- EnvironmentId: *c.environmentNamespace,
+ EnvironmentId: *c.environmentID,
Role: role,
},
}
diff --git a/hack/create-api-key/README.md b/hack/create-api-key/README.md
index dd134f98e2..5677bc004f 100644
--- a/hack/create-api-key/README.md
+++ b/hack/create-api-key/README.md
@@ -8,7 +8,7 @@ go run ./hack/create-api-key create \
--name=key-name \
--role=key-role \
--output=full-path-to-output-file \
- --environment-namespace=environment-namespace \
+ --environment-id=environment-id \
--no-profile \
--no-gcp-trace-enabled
```
diff --git a/hack/create-api-key/command.go b/hack/create-api-key/command.go
index bd8ddf13d8..e8d2755a22 100644
--- a/hack/create-api-key/command.go
+++ b/hack/create-api-key/command.go
@@ -32,13 +32,13 @@ import (
type command struct {
*kingpin.CmdClause
- certPath *string
- serviceTokenPath *string
- webGatewayAddress *string
- name *string
- role *string
- output *string
- environmentNamespace *string
+ certPath *string
+ serviceTokenPath *string
+ webGatewayAddress *string
+ name *string
+ role *string
+ output *string
+ environmentID *string
}
func registerCommand(r cli.CommandRegistry, p cli.ParentCommand) *command {
@@ -52,9 +52,9 @@ func registerCommand(r cli.CommandRegistry, p cli.ParentCommand) *command {
role: cmd.Flag(
"role", "The role of key.").Default("SDK_CLIENT").Enum("UNKNOWN", "SDK_CLIENT", "SDK_SERVER"),
output: cmd.Flag("output", "Path of file to write api key.").Required().String(),
- environmentNamespace: cmd.Flag(
- "environment-namespace",
- "The environment namespace to store api key",
+ environmentID: cmd.Flag(
+ "environment-id",
+ "The environment id to store api key",
).Required().String(),
}
r.RegisterCommand(command)
@@ -77,7 +77,7 @@ func (c *command) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.
Name: *c.name,
Role: accountproto.APIKey_Role(role),
},
- EnvironmentId: *c.environmentNamespace,
+ EnvironmentId: *c.environmentID,
})
if err != nil {
logger.Error("Failed to create api key", zap.Error(err))
diff --git a/hack/delete-e2e-data-mysql/command.go b/hack/delete-e2e-data-mysql/command.go
index 6cbf5e258e..6edf92fcea 100644
--- a/hack/delete-e2e-data-mysql/command.go
+++ b/hack/delete-e2e-data-mysql/command.go
@@ -47,6 +47,7 @@ var (
{table: "tag", targetField: "name"},
{table: "ops_progressive_rollout", targetField: "feature_id"},
{table: "flag_trigger", targetField: "description"},
+ {table: "code_reference", targetField: "feature_id"},
{table: "feature", targetField: "id"},
{table: "api_key", targetField: "name"},
}
diff --git a/manifests/bucketeer/charts/api/templates/deployment.yaml b/manifests/bucketeer/charts/api/templates/deployment.yaml
index 63d63a161a..650e7421c7 100644
--- a/manifests/bucketeer/charts/api/templates/deployment.yaml
+++ b/manifests/bucketeer/charts/api/templates/deployment.yaml
@@ -88,6 +88,8 @@ spec:
value: "{{ .Values.env.accountService }}"
- name: BUCKETEER_API_PUSH_SERVICE
value: "{{ .Values.env.pushService }}"
+ - name: BUCKETEER_API_CODE_REF_SERVICE
+ value: "{{ .Values.env.codeRefService }}"
- name: BUCKETEER_API_PORT
value: "{{ .Values.env.port }}"
- name: BUCKETEER_API_METRICS_PORT
diff --git a/manifests/bucketeer/charts/api/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/api/templates/envoy-configmap.yaml
index 1f52615e9f..ca5682c528 100644
--- a/manifests/bucketeer/charts/api/templates/envoy-configmap.yaml
+++ b/manifests/bucketeer/charts/api/templates/envoy-configmap.yaml
@@ -285,6 +285,18 @@ data:
retry_policy:
retry_on: 5xx
num_retries: 3
+ - match:
+ headers:
+ - name: content-type
+ string_match:
+ exact: application/grpc
+ prefix: /bucketeer.coderef.CodeReferenceService
+ route:
+ cluster: web
+ timeout: 15s
+ retry_policy:
+ retry_on: 5xx
+ num_retries: 3
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
diff --git a/manifests/bucketeer/charts/api/values.yaml b/manifests/bucketeer/charts/api/values.yaml
index ec332d9d58..1c4f4b3c87 100644
--- a/manifests/bucketeer/charts/api/values.yaml
+++ b/manifests/bucketeer/charts/api/values.yaml
@@ -27,6 +27,7 @@ env:
featureService: localhost:9001
accountService: localhost:9001
pushService: localhost:9001
+ codeRefService: localhost:9001
traceSamplingProbability: 0.0001
affinity: {}
nodeSelector: {}
@@ -53,7 +54,7 @@ envoy:
tag: v1.31.0
pullPolicy: IfNotPresent
lbPolicy: LEAST_REQUEST
- descriptor: "CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCuIFChxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvEg9nb29nbGUucHJvdG9idWYimAEKBlN0cnVjdBI7CgZmaWVsZHMYASADKAsyIy5nb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5UgZmaWVsZHMaUQoLRmllbGRzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASKyAgoFVmFsdWUSOwoKbnVsbF92YWx1ZRgBIAEoDjIaLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAFIJbnVsbFZhbHVlEiMKDG51bWJlcl92YWx1ZRgCIAEoAUgAUgtudW1iZXJWYWx1ZRIjCgxzdHJpbmdfdmFsdWUYAyABKAlIAFILc3RyaW5nVmFsdWUSHwoKYm9vbF92YWx1ZRgEIAEoCEgAUglib29sVmFsdWUSPAoMc3RydWN0X3ZhbHVlGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAUgtzdHJ1Y3RWYWx1ZRI7CgpsaXN0X3ZhbHVlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZUgAUglsaXN0VmFsdWVCBgoEa2luZCI7CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YWx1ZXMqGwoJTnVsbFZhbHVlEg4KCk5VTExfVkFMVUUQAEJ/ChNjb20uZ29vZ2xlLnByb3RvYnVmQgtTdHJ1Y3RQcm90b1ABWi9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zdHJ1Y3RwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqY+Cixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iswgKB1N3YWdnZXISGAoHc3dhZ2dlchgBIAEoCVIHc3dhZ2dlchJDCgRpbmZvGAIgASgLMi8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mb1IEaW5mbxISCgRob3N0GAMgASgJUgRob3N0EhsKCWJhc2VfcGF0aBgEIAEoCVIIYmFzZVBhdGgSSwoHc2NoZW1lcxgFIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEl8KCXJlc3BvbnNlcxgKIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJxChRzZWN1cml0eV9kZWZpbml0aW9ucxgLIAEoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnNSE3NlY3VyaXR5RGVmaW5pdGlvbnMSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJCCgR0YWdzGA0gAygLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgR0YWdzEmUKDWV4dGVybmFsX2RvY3MYDiABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJiCgpleHRlbnNpb25zGA8gAygLMkIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJSgQICRAKItYHCglPcGVyYXRpb24SEgoEdGFncxgBIAMoCVIEdGFncxIYCgdzdW1tYXJ5GAIgASgJUgdzdW1tYXJ5EiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAQgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSIQoMb3BlcmF0aW9uX2lkGAUgASgJUgtvcGVyYXRpb25JZBIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEmEKCXJlc3BvbnNlcxgJIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEksKB3NjaGVtZXMYCiADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSHgoKZGVwcmVjYXRlZBgLIAEoCFIKZGVwcmVjYXRlZBJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EmQKCmV4dGVuc2lvbnMYDSADKAsyRC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zElUKCnBhcmFtZXRlcnMYDiABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5QYXJhbWV0ZXJzUgpwYXJhbWV0ZXJzGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCSJiCgpQYXJhbWV0ZXJzElQKB2hlYWRlcnMYASADKAsyOi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXJSB2hlYWRlcnMiowIKD0hlYWRlclBhcmFtZXRlchISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJTCgR0eXBlGAMgASgOMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyLlR5cGVSBHR5cGUSFgoGZm9ybWF0GAQgASgJUgZmb3JtYXQSGgoIcmVxdWlyZWQYBSABKAhSCHJlcXVpcmVkIkUKBFR5cGUSCwoHVU5LTk9XThAAEgoKBlNUUklORxABEgoKBk5VTUJFUhACEgsKB0lOVEVHRVIQAxILCgdCT09MRUFOEARKBAgGEAdKBAgHEAgi2AEKBkhlYWRlchIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEgoEdHlwZRgCIAEoCVIEdHlwZRIWCgZmb3JtYXQYAyABKAlSBmZvcm1hdBIYCgdkZWZhdWx0GAYgASgJUgdkZWZhdWx0EhgKB3BhdHRlcm4YDSABKAlSB3BhdHRlcm5KBAgEEAVKBAgFEAZKBAgHEAhKBAgIEAlKBAgJEApKBAgKEAtKBAgLEAxKBAgMEA1KBAgOEA9KBAgPEBBKBAgQEBFKBAgREBJKBAgSEBMimgUKCFJlc3BvbnNlEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhJJCgZzY2hlbWEYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSBnNjaGVtYRJaCgdoZWFkZXJzGAMgAygLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEl0KCGV4YW1wbGVzGAQgAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXhhbXBsZXNFbnRyeVIIZXhhbXBsZXMSYwoKZXh0ZW5zaW9ucxgFIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxptCgxIZWFkZXJzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSRwoFdmFsdWUYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJSBXZhbHVlOgI4ARo7Cg1FeGFtcGxlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi1gMKBEluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIoChB0ZXJtc19vZl9zZXJ2aWNlGAMgASgJUg50ZXJtc09mU2VydmljZRJMCgdjb250YWN0GAQgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuQ29udGFjdFIHY29udGFjdBJMCgdsaWNlbnNlGAUgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuTGljZW5zZVIHbGljZW5zZRIYCgd2ZXJzaW9uGAYgASgJUgd2ZXJzaW9uEl8KCmV4dGVuc2lvbnMYByADKAsyPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJFCgdDb250YWN0EhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwSFAoFZW1haWwYAyABKAlSBWVtYWlsIi8KB0xpY2Vuc2USEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybCJLChVFeHRlcm5hbERvY3VtZW50YXRpb24SIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhAKA3VybBgCIAEoCVIDdXJsIqoCCgZTY2hlbWESVgoLanNvbl9zY2hlbWEYASABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUgpqc29uU2NoZW1hEiQKDWRpc2NyaW1pbmF0b3IYAiABKAlSDWRpc2NyaW1pbmF0b3ISGwoJcmVhZF9vbmx5GAMgASgIUghyZWFkT25seRJlCg1leHRlcm5hbF9kb2NzGAUgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSGAoHZXhhbXBsZRgGIAEoCVIHZXhhbXBsZUoECAQQBSLXCgoKSlNPTlNjaGVtYRIQCgNyZWYYAyABKAlSA3JlZhIUCgV0aXRsZRgFIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlZmF1bHQYByABKAlSB2RlZmF1bHQSGwoJcmVhZF9vbmx5GAggASgIUghyZWFkT25seRIYCgdleGFtcGxlGAkgASgJUgdleGFtcGxlEh8KC211bHRpcGxlX29mGAogASgBUgptdWx0aXBsZU9mEhgKB21heGltdW0YCyABKAFSB21heGltdW0SKwoRZXhjbHVzaXZlX21heGltdW0YDCABKAhSEGV4Y2x1c2l2ZU1heGltdW0SGAoHbWluaW11bRgNIAEoAVIHbWluaW11bRIrChFleGNsdXNpdmVfbWluaW11bRgOIAEoCFIQZXhjbHVzaXZlTWluaW11bRIdCgptYXhfbGVuZ3RoGA8gASgEUgltYXhMZW5ndGgSHQoKbWluX2xlbmd0aBgQIAEoBFIJbWluTGVuZ3RoEhgKB3BhdHRlcm4YESABKAlSB3BhdHRlcm4SGwoJbWF4X2l0ZW1zGBQgASgEUghtYXhJdGVtcxIbCgltaW5faXRlbXMYFSABKARSCG1pbkl0ZW1zEiEKDHVuaXF1ZV9pdGVtcxgWIAEoCFILdW5pcXVlSXRlbXMSJQoObWF4X3Byb3BlcnRpZXMYGCABKARSDW1heFByb3BlcnRpZXMSJQoObWluX3Byb3BlcnRpZXMYGSABKARSDW1pblByb3BlcnRpZXMSGgoIcmVxdWlyZWQYGiADKAlSCHJlcXVpcmVkEhQKBWFycmF5GCIgAygJUgVhcnJheRJfCgR0eXBlGCMgAygOMksuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5KU09OU2NoZW1hU2ltcGxlVHlwZXNSBHR5cGUSFgoGZm9ybWF0GCQgASgJUgZmb3JtYXQSEgoEZW51bRguIAMoCVIEZW51bRJ6ChNmaWVsZF9jb25maWd1cmF0aW9uGOkHIAEoCzJILmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRmllbGRDb25maWd1cmF0aW9uUhJmaWVsZENvbmZpZ3VyYXRpb24SZQoKZXh0ZW5zaW9ucxgwIAMoCzJFLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGjwKEkZpZWxkQ29uZmlndXJhdGlvbhImCg9wYXRoX3BhcmFtX25hbWUYLyABKAlSDXBhdGhQYXJhbU5hbWUaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEidwoVSlNPTlNjaGVtYVNpbXBsZVR5cGVzEgsKB1VOS05PV04QABIJCgVBUlJBWRABEgsKB0JPT0xFQU4QAhILCgdJTlRFR0VSEAMSCAoETlVMTBAEEgoKBk5VTUJFUhAFEgoKBk9CSkVDVBAGEgoKBlNUUklORxAHSgQIARACSgQIAhADSgQIBBAFSgQIEhATSgQIExAUSgQIFxAYSgQIGxAcSgQIHBAdSgQIHRAeSgQIHhAiSgQIJRAqSgQIKhArSgQIKxAuItkCCgNUYWcSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgDIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEl4KCmV4dGVuc2lvbnMYBCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWcuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIvcBChNTZWN1cml0eURlZmluaXRpb25zEmgKCHNlY3VyaXR5GAEgAygLMkwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9ucy5TZWN1cml0eUVudHJ5UghzZWN1cml0eRp2Cg1TZWN1cml0eUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ek8KBXZhbHVlGAIgASgLMjkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWVSBXZhbHVlOgI4ASL/BgoOU2VjdXJpdHlTY2hlbWUSUgoEdHlwZRgBIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLlR5cGVSBHR5cGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhIKBG5hbWUYAyABKAlSBG5hbWUSTAoCaW4YBCABKA4yPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5JblICaW4SUgoEZmxvdxgFIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkZsb3dSBGZsb3cSKwoRYXV0aG9yaXphdGlvbl91cmwYBiABKAlSEGF1dGhvcml6YXRpb25VcmwSGwoJdG9rZW5fdXJsGAcgASgJUgh0b2tlblVybBJJCgZzY29wZXMYCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXNSBnNjb3BlcxJpCgpleHRlbnNpb25zGAkgAygLMkkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIksKBFR5cGUSEAoMVFlQRV9JTlZBTElEEAASDgoKVFlQRV9CQVNJQxABEhAKDFRZUEVfQVBJX0tFWRACEg8KC1RZUEVfT0FVVEgyEAMiMQoCSW4SDgoKSU5fSU5WQUxJRBAAEgwKCElOX1FVRVJZEAESDQoJSU5fSEVBREVSEAIiagoERmxvdxIQCgxGTE9XX0lOVkFMSUQQABIRCg1GTE9XX0lNUExJQ0lUEAESEQoNRkxPV19QQVNTV09SRBACEhQKEEZMT1dfQVBQTElDQVRJT04QAxIUChBGTE9XX0FDQ0VTU19DT0RFEAQi9gIKE1NlY3VyaXR5UmVxdWlyZW1lbnQSigEKFHNlY3VyaXR5X3JlcXVpcmVtZW50GAEgAygLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50RW50cnlSE3NlY3VyaXR5UmVxdWlyZW1lbnQaMAoYU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlEhQKBXNjb3BlGAEgAygJUgVzY29wZRqfAQoYU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Em0KBXZhbHVlGAIgASgLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50VmFsdWVSBXZhbHVlOgI4ASKWAQoGU2NvcGVzElIKBXNjb3BlGAEgAygLMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzLlNjb3BlRW50cnlSBXNjb3BlGjgKClNjb3BlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASo7CgZTY2hlbWUSCwoHVU5LTk9XThAAEggKBEhUVFAQARIJCgVIVFRQUxACEgYKAldTEAMSBwoDV1NTEARCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCv0GCi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvOn4KEW9wZW5hcGl2Ml9zd2FnZ2VyEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJIIIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXJSEG9wZW5hcGl2MlN3YWdnZXI6hgEKE29wZW5hcGl2Ml9vcGVyYXRpb24SHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiSCCABKAsyNC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb25SEm9wZW5hcGl2Mk9wZXJhdGlvbjp+ChBvcGVuYXBpdjJfc2NoZW1hEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJIIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIPb3BlbmFwaXYyU2NoZW1hOnUKDW9wZW5hcGl2Ml90YWcSHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMYkgggASgLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgxvcGVuYXBpdjJUYWc6fgoPb3BlbmFwaXYyX2ZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiSCCABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUg5vcGVuYXBpdjJGaWVsZEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMKwAQKFXByb3RvL3VzZXIvdXNlci5wcm90bxIOYnVja2V0ZWVyLnVzZXIi3gMKBFVzZXISDgoCaWQYASABKAlSAmlkEjIKBGRhdGEYAiADKAsyHi5idWNrZXRlZXIudXNlci5Vc2VyLkRhdGFFbnRyeVIEZGF0YRJFCgt0YWdnZWRfZGF0YRgDIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuVGFnZ2VkRGF0YUVudHJ5Ugp0YWdnZWREYXRhEhsKCWxhc3Rfc2VlbhgEIAEoA1IIbGFzdFNlZW4SHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0GnwKBERhdGESOgoFdmFsdWUYASADKAsyJC5idWNrZXRlZXIudXNlci5Vc2VyLkRhdGEuVmFsdWVFbnRyeVIFdmFsdWUaOAoKVmFsdWVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGjcKCURhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlgKD1RhZ2dlZERhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YVIFdmFsdWU6AjgBQi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by91c2VyYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCp4CChpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUisQEKBlJlYXNvbhIyCgR0eXBlGAEgASgOMh4uYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uLlR5cGVSBHR5cGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIloKBFR5cGUSCgoGVEFSR0VUEAASCAoEUlVMRRABEgsKB0RFRkFVTFQQAxIKCgZDTElFTlQQBBIRCg1PRkZfVkFSSUFUSU9OEAUSEAoMUFJFUkVRVUlTSVRFEAZCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqYBgoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aGnByb3RvL2ZlYXR1cmUvcmVhc29uLnByb3RvIuMCCgpFdmFsdWF0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIXCgd1c2VyX2lkGAQgASgJUgZ1c2VySWQSIQoMdmFyaWF0aW9uX2lkGAUgASgJUgt2YXJpYXRpb25JZBI+Cgl2YXJpYXRpb24YBiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25CAhgBUgl2YXJpYXRpb24SMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SJwoPdmFyaWF0aW9uX3ZhbHVlGAggASgJUg52YXJpYXRpb25WYWx1ZRIlCg52YXJpYXRpb25fbmFtZRgJIAEoCVINdmFyaWF0aW9uTmFtZSKGAgoPVXNlckV2YWx1YXRpb25zEhIKAmlkGAEgASgJQgIYAVICaWQSPwoLZXZhbHVhdGlvbnMYAiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgtldmFsdWF0aW9ucxIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSMAoUYXJjaGl2ZWRfZmVhdHVyZV9pZHMYBCADKAlSEmFyY2hpdmVkRmVhdHVyZUlkcxIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIioKBVN0YXRlEgoKBlFVRVVFRBAAEgsKB1BBUlRJQUwQARIICgRGVUxMEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrHAwoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlItoCCgZDbGF1c2USDgoCaWQYASABKAlSAmlkEhwKCWF0dHJpYnV0ZRgCIAEoCVIJYXR0cmlidXRlEj4KCG9wZXJhdG9yGAMgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchIWCgZ2YWx1ZXMYBCADKAlSBnZhbHVlcyLJAQoIT3BlcmF0b3ISCgoGRVFVQUxTEAASBgoCSU4QARINCglFTkRTX1dJVEgQAhIPCgtTVEFSVFNfV0lUSBADEgsKB1NFR01FTlQQBBILCgdHUkVBVEVSEAUSFAoQR1JFQVRFUl9PUl9FUVVBTBAGEggKBExFU1MQBxIRCg1MRVNTX09SX0VRVUFMEAgSCgoGQkVGT1JFEAkSCQoFQUZURVIQChIQCgxGRUFUVVJFX0ZMQUcQCxITCg9QQVJUSUFMTFlfTUFUQ0gQDEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrsEChxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSItCg1GaXhlZFN0cmF0ZWd5EhwKCXZhcmlhdGlvbhgBIAEoCVIJdmFyaWF0aW9uIqIBCg9Sb2xsb3V0U3RyYXRlZ3kSTAoKdmFyaWF0aW9ucxgBIAMoCzIsLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneS5WYXJpYXRpb25SCnZhcmlhdGlvbnMaQQoJVmFyaWF0aW9uEhwKCXZhcmlhdGlvbhgBIAEoCVIJdmFyaWF0aW9uEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0IvgBCghTdHJhdGVneRI0CgR0eXBlGAEgASgOMiAuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3kuVHlwZVIEdHlwZRJHCg5maXhlZF9zdHJhdGVneRgCIAEoCzIgLmJ1Y2tldGVlci5mZWF0dXJlLkZpeGVkU3RyYXRlZ3lSDWZpeGVkU3RyYXRlZ3kSTQoQcm9sbG91dF9zdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIPcm9sbG91dFN0cmF0ZWd5Ih4KBFR5cGUSCQoFRklYRUQQABILCgdST0xMT1VUEAFCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqpAgoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aHHByb3RvL2ZlYXR1cmUvc3RyYXRlZ3kucHJvdG8ihAEKBFJ1bGUSDgoCaWQYASABKAlSAmlkEjcKCHN0cmF0ZWd5GAIgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSCHN0cmF0ZWd5EjMKB2NsYXVzZXMYAyADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2VSB2NsYXVzZXNCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqoAQoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIjwKBlRhcmdldBIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIUCgV1c2VycxgCIAMoCVIFdXNlcnNCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwr0AgoqcHJvdG8vZmVhdHVyZS9mZWF0dXJlX2xhc3RfdXNlZF9pbmZvLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSL3AQoTRmVhdHVyZUxhc3RVc2VkSW5mbxIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGAoHdmVyc2lvbhgCIAEoBVIHdmVyc2lvbhIgCgxsYXN0X3VzZWRfYXQYAyABKANSCmxhc3RVc2VkQXQSHQoKY3JlYXRlZF9hdBgEIAEoA1IJY3JlYXRlZEF0EjIKFWNsaWVudF9vbGRlc3RfdmVyc2lvbhgFIAEoCVITY2xpZW50T2xkZXN0VmVyc2lvbhIyChVjbGllbnRfbGF0ZXN0X3ZlcnNpb24YBiABKAlSE2NsaWVudExhdGVzdFZlcnNpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrCAQogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIlAKDFByZXJlcXVpc2l0ZRIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrMMChtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlGhhwcm90by9mZWF0dXJlL3J1bGUucHJvdG8aGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxoqcHJvdG8vZmVhdHVyZS9mZWF0dXJlX2xhc3RfdXNlZF9pbmZvLnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90byLSBwoHRmVhdHVyZRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGAoHZW5hYmxlZBgEIAEoCFIHZW5hYmxlZBIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkEjkKFmV2YWx1YXRpb25fdW5kZWxheWFibGUYBiABKAhCAhgBUhVldmFsdWF0aW9uVW5kZWxheWFibGUSEAoDdHRsGAcgASgFUgN0dGwSGAoHdmVyc2lvbhgIIAEoBVIHdmVyc2lvbhIdCgpjcmVhdGVkX2F0GAkgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgKIAEoA1IJdXBkYXRlZEF0EjwKCnZhcmlhdGlvbnMYCyADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSMwoHdGFyZ2V0cxgMIAMoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlRhcmdldFIHdGFyZ2V0cxItCgVydWxlcxgNIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEkYKEGRlZmF1bHRfc3RyYXRlZ3kYDiABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIPZGVmYXVsdFN0cmF0ZWd5EiMKDW9mZl92YXJpYXRpb24YDyABKAlSDG9mZlZhcmlhdGlvbhISCgR0YWdzGBAgAygJUgR0YWdzEkwKDmxhc3RfdXNlZF9pbmZvGBEgASgLMiYuYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZUxhc3RVc2VkSW5mb1IMbGFzdFVzZWRJbmZvEh4KCm1haW50YWluZXIYEiABKAlSCm1haW50YWluZXISTwoOdmFyaWF0aW9uX3R5cGUYEyABKA4yKC5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlLlZhcmlhdGlvblR5cGVSDXZhcmlhdGlvblR5cGUSGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkEkUKDXByZXJlcXVpc2l0ZXMYFSADKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDXByZXJlcXVpc2l0ZXMSIwoNc2FtcGxpbmdfc2VlZBgWIAEoCVIMc2FtcGxpbmdTZWVkIj4KDVZhcmlhdGlvblR5cGUSCgoGU1RSSU5HEAASCwoHQk9PTEVBThABEgoKBk5VTUJFUhACEggKBEpTT04QAyJSCghGZWF0dXJlcxI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEg4KAmlkGAIgASgJUgJpZCJzChJFbnZpcm9ubWVudEZlYXR1cmUSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSNgoIZmVhdHVyZXMYAiADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcyJnCgNUYWcSDgoCaWQYASABKAlSAmlkEh0KCmNyZWF0ZWRfYXQYAiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAMgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgEIAEoCVIEbmFtZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK5AEKGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI2CgNBbnkSGQoIdHlwZV91cmwYASABKAlSB3R5cGVVcmwSFAoFdmFsdWUYAiABKAxSBXZhbHVlQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKtQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiggEKDFNlZ21lbnRVc2VycxIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSNAoFdXNlcnMYAiADKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlclIFdXNlcnMSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKoAUKIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSKtBAoLRmxhZ1RyaWdnZXISDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI3CgR0eXBlGAQgASgOMiMuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuVHlwZVIEdHlwZRI9CgZhY3Rpb24YBSABKA4yJS5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlci5BY3Rpb25SBmFjdGlvbhIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SIwoNdHJpZ2dlcl9jb3VudBgHIAEoBVIMdHJpZ2dlckNvdW50EioKEWxhc3RfdHJpZ2dlcmVkX2F0GAggASgDUg9sYXN0VHJpZ2dlcmVkQXQSFAoFdG9rZW4YCSABKAlSBXRva2VuEhoKCGRpc2FibGVkGAogASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAsgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgMIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkIioKBFR5cGUSEAoMVHlwZV9VTktOT1dOEAASEAoMVHlwZV9XRUJIT09LEAEiOwoGQWN0aW9uEhIKDkFjdGlvbl9VTktOT1dOEAASDQoJQWN0aW9uX09OEAESDgoKQWN0aW9uX09GRhACSgQIAxAEQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKwCMKG3Byb3RvL2ZlYXR1cmUvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxogcHJvdG8vZmVhdHVyZS9mbGFnX3RyaWdnZXIucHJvdG8iOQoHQ29tbWFuZBIuCgdjb21tYW5kGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIHY29tbWFuZCK1AwoUQ3JlYXRlRmVhdHVyZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSEgoEdGFncxgFIAMoCVIEdGFncxJYChpkZWZhdWx0X29uX3ZhcmlhdGlvbl9pbmRleBgGIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhdkZWZhdWx0T25WYXJpYXRpb25JbmRleBJaChtkZWZhdWx0X29mZl92YXJpYXRpb25faW5kZXgYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIYZGVmYXVsdE9mZlZhcmlhdGlvbkluZGV4Ek8KDnZhcmlhdGlvbl90eXBlGAggASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlIhcKFUFyY2hpdmVGZWF0dXJlQ29tbWFuZCIZChdVbmFyY2hpdmVGZWF0dXJlQ29tbWFuZCIWChREZWxldGVGZWF0dXJlQ29tbWFuZCIqChRSZW5hbWVGZWF0dXJlQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIjwKGENoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24iuAEKKUNoYW5nZUJ1bGtVcGxvYWRTZWdtZW50VXNlcnNTdGF0dXNDb21tYW5kEjkKBnN0YXR1cxgBIAEoDjIhLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnQuU3RhdHVzUgZzdGF0dXMSOgoFc3RhdGUYAiABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUSFAoFY291bnQYAyABKANSBWNvdW50IiEKDUFkZFRhZ0NvbW1hbmQSEAoDdGFnGAEgASgJUgN0YWciJAoQUmVtb3ZlVGFnQ29tbWFuZBIQCgN0YWcYASABKAlSA3RhZyIWChRFbmFibGVGZWF0dXJlQ29tbWFuZCIXChVEaXNhYmxlRmVhdHVyZUNvbW1hbmQiYQoTQWRkVmFyaWF0aW9uQ29tbWFuZBIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24iKAoWUmVtb3ZlVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiQwobQ2hhbmdlVmFyaWF0aW9uVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUiQAoaQ2hhbmdlVmFyaWF0aW9uTmFtZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVQohQ2hhbmdlVmFyaWF0aW9uRGVzY3JpcHRpb25Db21tYW5kEg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iKwoZQ2hhbmdlT2ZmVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiPwoZQWRkVXNlclRvVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSEgoEdXNlchgCIAEoCVIEdXNlciJECh5SZW1vdmVVc2VyRnJvbVZhcmlhdGlvbkNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBHVzZXIYAiABKAlSBHVzZXIiVwocQ2hhbmdlRGVmYXVsdFN0cmF0ZWd5Q29tbWFuZBI3CghzdHJhdGVneRgBIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSI9Cg5BZGRSdWxlQ29tbWFuZBIrCgRydWxlGAEgASgLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIEcnVsZSJ9ChlDaGFuZ2VSdWxlU3RyYXRlZ3lDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSNwoIc3RyYXRlZ3kYAyABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIIc3RyYXRlZ3kiNAoXQ2hhbmdlUnVsZXNPcmRlckNvbW1hbmQSGQoIcnVsZV9pZHMYAiADKAlSB3J1bGVJZHMiIwoRRGVsZXRlUnVsZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkIl4KEEFkZENsYXVzZUNvbW1hbmQSFwoHcnVsZV9pZBgBIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgCIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlIj4KE0RlbGV0ZUNsYXVzZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCJlChxDaGFuZ2VDbGF1c2VBdHRyaWJ1dGVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSHAoJYXR0cmlidXRlGAMgASgJUglhdHRyaWJ1dGUihgEKG0NoYW5nZUNsYXVzZU9wZXJhdG9yQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEj4KCG9wZXJhdG9yGAMgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvciJWChVBZGRDbGF1c2VWYWx1ZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIUCgV2YWx1ZRgDIAEoCVIFdmFsdWUiWQoYUmVtb3ZlQ2xhdXNlVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSFAoFdmFsdWUYAyABKAlSBXZhbHVlIoMBChpDaGFuZ2VGaXhlZFN0cmF0ZWd5Q29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjwKCHN0cmF0ZWd5GAMgASgLMiAuYnVja2V0ZWVyLmZlYXR1cmUuRml4ZWRTdHJhdGVneVIIc3RyYXRlZ3kihwEKHENoYW5nZVJvbGxvdXRTdHJhdGVneUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI+CghzdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIIc3RyYXRlZ3kiTAoUQ3JlYXRlU2VnbWVudENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iFgoURGVsZXRlU2VnbWVudENvbW1hbmQiLgoYQ2hhbmdlU2VnbWVudE5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiQwofQ2hhbmdlU2VnbWVudERlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24ibgoVQWRkU2VnbWVudFVzZXJDb21tYW5kEhkKCHVzZXJfaWRzGAEgAygJUgd1c2VySWRzEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlInEKGERlbGV0ZVNlZ21lbnRVc2VyQ29tbWFuZBIZCgh1c2VyX2lkcxgBIAMoCVIHdXNlcklkcxI6CgVzdGF0ZRgCIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSJvCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzQ29tbWFuZBISCgRkYXRhGAEgASgMUgRkYXRhEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlIiAKHkluY3JlbWVudEZlYXR1cmVWZXJzaW9uQ29tbWFuZCJCChNDbG9uZUZlYXR1cmVDb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhoKGFJlc2V0U2FtcGxpbmdTZWVkQ29tbWFuZCJdChZBZGRQcmVyZXF1aXNpdGVDb21tYW5kEkMKDHByZXJlcXVpc2l0ZRgBIAEoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVIMcHJlcmVxdWlzaXRlIjoKGVJlbW92ZVByZXJlcXVpc2l0ZUNvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkImkKIkNoYW5nZVByZXJlcXVpc2l0ZVZhcmlhdGlvbkNvbW1hbmQSQwoMcHJlcmVxdWlzaXRlGAEgASgLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUgxwcmVyZXF1aXNpdGUi0wEKGENyZWF0ZUZsYWdUcmlnZ2VyQ29tbWFuZBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgCIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAMgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uIhkKF1Jlc2V0RmxhZ1RyaWdnZXJDb21tYW5kIkcKI0NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIaChhFbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQiGwoZRGlzYWJsZUZsYWdUcmlnZ2VyQ29tbWFuZCIaChhEZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQiHwodVXBkYXRlRmxhZ1RyaWdnZXJVc2FnZUNvbW1hbmRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqslwEKG3Byb3RvL2ZlYXR1cmUvc2VydmljZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxobcHJvdG8vZmVhdHVyZS9jb21tYW5kLnByb3RvGhtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoVcHJvdG8vdXNlci91c2VyLnByb3RvGhtwcm90by9mZWF0dXJlL3NlZ21lbnQucHJvdG8aIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8aGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8iUAoRR2V0RmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkoKEkdldEZlYXR1cmVSZXNwb25zZRI0CgdmZWF0dXJlGAEgASgLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIHZmVhdHVyZSJTChJHZXRGZWF0dXJlc1JlcXVlc3QSEAoDaWRzGAIgAygJUgNpZHMSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiTQoTR2V0RmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzIvUFChNMaXN0RmVhdHVyZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISEgoEdGFncxgDIAMoCVIEdGFncxJJCghvcmRlcl9ieRgEIAEoDjIuLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJeCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIeCgptYWludGFpbmVyGAcgASgJUgptYWludGFpbmVyEjQKB2VuYWJsZWQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEkEKDmhhc19leHBlcmltZW50GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaGFzRXhwZXJpbWVudBIlCg5zZWFyY2hfa2V5d29yZBgKIAEoCVINc2VhcmNoS2V5d29yZBI2CghhcmNoaXZlZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEkcKEWhhc19wcmVyZXF1aXNpdGVzGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIQaGFzUHJlcmVxdWlzaXRlcxIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZCJXCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIICgRUQUdTEAQSCwoHRU5BQkxFRBAFIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQAUoECAYQByKHAQoUTGlzdEZlYXR1cmVzUmVzcG9uc2USNgoIZmVhdHVyZXMYASADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAQoaTGlzdEVuYWJsZWRGZWF0dXJlc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchISCgR0YWdzGAMgAygJUgR0YWdzEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIm0KG0xpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yIoYBChRDcmVhdGVGZWF0dXJlUmVxdWVzdBJBCgdjb21tYW5kGAEgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiTQoVQ3JlYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIs8FChRVcGRhdGVGZWF0dXJlUmVxdWVzdBIYCgdjb21tZW50GAEgASgJUgdjb21tZW50EiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkEg4KAmlkGAMgASgJUgJpZBIwCgRuYW1lGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAUgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbhISCgR0YWdzGAYgAygJUgR0YWdzEjQKB2VuYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEjYKCGFyY2hpdmVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSPAoKdmFyaWF0aW9ucxgJIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxJFCg1wcmVyZXF1aXNpdGVzGAogAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEjMKB3RhcmdldHMYCyADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMSLQoFcnVsZXMYDCADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxJGChBkZWZhdWx0X3N0cmF0ZWd5GA0gASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSD2RlZmF1bHRTdHJhdGVneRJBCg1vZmZfdmFyaWF0aW9uGA4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgxvZmZWYXJpYXRpb24iTQoVVXBkYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIrABChRFbmFibGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRW5hYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVEaXNhYmxlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZEaXNhYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVBcmNoaXZlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BcmNoaXZlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZBcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrYBChdVbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGgoYVW5hcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrABChREZWxldGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGVsZXRlRmVhdHVyZVJlc3BvbnNlIt8DChtVcGRhdGVGZWF0dXJlRGV0YWlsc1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEl0KFnJlbmFtZV9mZWF0dXJlX2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuZmVhdHVyZS5SZW5hbWVGZWF0dXJlQ29tbWFuZFIUcmVuYW1lRmVhdHVyZUNvbW1hbmQSaQoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYAyABKAsyKy5idWNrZXRlZXIuZmVhdHVyZS5DaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBJKChBhZGRfdGFnX2NvbW1hbmRzGAQgAygLMiAuYnVja2V0ZWVyLmZlYXR1cmUuQWRkVGFnQ29tbWFuZFIOYWRkVGFnQ29tbWFuZHMSUwoTcmVtb3ZlX3RhZ19jb21tYW5kcxgFIAMoCzIjLmJ1Y2tldGVlci5mZWF0dXJlLlJlbW92ZVRhZ0NvbW1hbmRSEXJlbW92ZVRhZ0NvbW1hbmRzEhgKB2NvbW1lbnQYByABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWRKBAgGEAciHgocVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSKvAQoeVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBI2Cghjb21tYW5kcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkNvbW1hbmRSCGNvbW1hbmRzEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiIQofVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXNwb25zZSKhAgodVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEjYKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZFIIY29tbWFuZHMSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBJJCgRmcm9tGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QuRnJvbVIEZnJvbRIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZCImCgRGcm9tEgsKB1VOS05PV04QABIICgRVU0VSEAESBwoDT1BTEAJKBAgDEAQiIAoeVXBkYXRlRmVhdHVyZVRhcmdldGluZ1Jlc3BvbnNlIpQBChNDbG9uZUZlYXR1cmVSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJACgdjb21tYW5kGAIgASgLMiYuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIWChRDbG9uZUZlYXR1cmVSZXNwb25zZSLZAQoUQ3JlYXRlU2VnbWVudFJlcXVlc3QSVAoHY29tbWFuZBgBIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIXCgRuYW1lGAMgASgJQgPgQQJSBG5hbWUSKgoOZW52aXJvbm1lbnRfaWQYBCABKAlCA+BBAlINZW52aXJvbm1lbnRJZBIgCgtkZXNjcmlwdGlvbhgFIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiTQoVQ3JlYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IloKEUdldFNlZ21lbnRSZXF1ZXN0EhMKAmlkGAEgASgJQgPgQQJSAmlkEioKDmVudmlyb25tZW50X2lkGAMgASgJQgPgQQJSDWVudmlyb25tZW50SWRKBAgCEAMiSgoSR2V0U2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IssEChNMaXN0U2VnbWVudHNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSQoIb3JkZXJfYnkYBCABKA4yLi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSXgoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSMwoGc3RhdHVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSBnN0YXR1cxJDChBpc19pbl91c2Vfc3RhdHVzGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaXNJblVzZVN0YXR1cxIqCg5lbnZpcm9ubWVudF9pZBgJIAEoCUID4EECUg1lbnZpcm9ubWVudElkIlwKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0NPTk5FQ1RJT05TEAQSCQoFVVNFUlMQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgDEAQihwEKFExpc3RTZWdtZW50c1Jlc3BvbnNlEjYKCHNlZ21lbnRzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFIIc2VnbWVudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiqQEKFERlbGV0ZVNlZ21lbnRSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJUCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudENvbW1hbmRCERgBkkEMMgpkZXByZWNhdGVkUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhcKFURlbGV0ZVNlZ21lbnRSZXNwb25zZSKVAgoUVXBkYXRlU2VnbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkkKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSCGNvbW1hbmRzEioKDmVudmlyb25tZW50X2lkGAQgASgJQgPgQQJSDWVudmlyb25tZW50SWQSMAoEbmFtZRgFIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb25KBAgDEAQiTQoVVXBkYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IpgBChVBZGRTZWdtZW50VXNlclJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BZGRTZWdtZW50VXNlckNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGAoWQWRkU2VnbWVudFVzZXJSZXNwb25zZSKeAQoYRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJFCgdjb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhsKGURlbGV0ZVNlZ21lbnRVc2VyUmVzcG9uc2UiuAEKFUdldFNlZ21lbnRVc2VyUmVxdWVzdBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHdXNlcl9pZBgCIAEoCVIGdXNlcklkEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIkwKFkdldFNlZ21lbnRVc2VyUmVzcG9uc2USMgoEdXNlchgBIAEoCzIeLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyUgR1c2VyIuYBChdMaXN0U2VnbWVudFVzZXJzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh0KCnNlZ21lbnRfaWQYAyABKAlSCXNlZ21lbnRJZBIxCgVzdGF0ZRgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgVzdGF0ZRIXCgd1c2VyX2lkGAUgASgJUgZ1c2VySWQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWRKBAgGEAciaAoYTGlzdFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEjQKBXVzZXJzGAEgAygLMh4uYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXJSBXVzZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yItACCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIdCgpzZWdtZW50X2lkGAIgASgJUglzZWdtZW50SWQSXQoHY29tbWFuZBgDIAEoCzIwLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZBJICgRkYXRhGAUgASgMQjSSQTEyL3NlZ21lbnQgdXNlciBpZHMgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIG5ldyBsaW5lUgRkYXRhEjoKBXN0YXRlGAYgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlSgQIARACIiAKHkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSKzAQofQnVsa0Rvd25sb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIiCgpzZWdtZW50X2lkGAIgASgJQgPgQQJSCXNlZ21lbnRJZBI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIqCg5lbnZpcm9ubWVudF9pZBgEIAEoCUID4EECUg1lbnZpcm9ubWVudElkSgQIARACIjYKIEJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEhIKBGRhdGEYASABKAxSBGRhdGEioQEKF0V2YWx1YXRlRmVhdHVyZXNSZXF1ZXN0EigKBHVzZXIYASABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEhAKA3RhZxgDIAEoCVIDdGFnEh0KCmZlYXR1cmVfaWQYBCABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJpChhFdmFsdWF0ZUZlYXR1cmVzUmVzcG9uc2USTQoQdXNlcl9ldmFsdWF0aW9ucxgBIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlVzZXJFdmFsdWF0aW9uc1IPdXNlckV2YWx1YXRpb25zIqwDCg9MaXN0VGFnc1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchJFCghvcmRlcl9ieRgEIAEoDjIqLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EloKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjIxLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiSAoHT3JkZXJCeRILCgdERUZBVUxUEAASBgoCSUQQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBE5BTUUQBCIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIidwoQTGlzdFRhZ3NSZXNwb25zZRIqCgR0YWdzGAEgAygLMhYuYnVja2V0ZWVyLmZlYXR1cmUuVGFnUgR0YWdzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IrMBChhDcmVhdGVGbGFnVHJpZ2dlclJlcXVlc3QSagobY3JlYXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhjcmVhdGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIicAoZQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiwwEKGERlbGV0ZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZGVsZXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhkZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSLmAQoYVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBKMAQonY2hhbmdlX2ZsYWdfdHJpZ2dlcl9kZXNjcmlwdGlvbl9jb21tYW5kGAMgASgLMjYuYnVja2V0ZWVyLmZlYXR1cmUuQ2hhbmdlRmxhZ1RyaWdnZXJEZXNjcmlwdGlvbkNvbW1hbmRSI2NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIhsKGVVwZGF0ZUZsYWdUcmlnZ2VyUmVzcG9uc2UiwwEKGEVuYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZW5hYmxlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJDb21tYW5kUhhlbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSLHAQoZRGlzYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSbQocZGlzYWJsZV9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmRSGWRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiHAoaRGlzYWJsZUZsYWdUcmlnZ2VyUmVzcG9uc2UivwEKF1Jlc2V0RmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJnChpyZXNldF9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJDb21tYW5kUhdyZXNldEZsYWdUcmlnZ2VyQ29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJvChhSZXNldEZsYWdUcmlnZ2VyUmVzcG9uc2USQQoMZmxhZ190cmlnZ2VyGAEgASgLMh4uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJSC2ZsYWdUcmlnZ2VyEhAKA3VybBgCIAEoCVIDdXJsIlQKFUdldEZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMibQoWR2V0RmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiqgMKF0xpc3RGbGFnVHJpZ2dlcnNSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIbCglwYWdlX3NpemUYBCABKAVSCHBhZ2VTaXplEk0KCG9yZGVyX2J5GAUgASgOMjIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJiCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yOS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiNgoHT3JkZXJCeRILCgdERUZBVUxUEAASDgoKQ1JFQVRFRF9BVBABEg4KClVQREFURURfQVQQAiIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgCEAMiowIKGExpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZRJjCg1mbGFnX3RyaWdnZXJzGAEgAygLMj4uYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1Jlc3BvbnNlLkZsYWdUcmlnZ2VyV2l0aFVybFIMZmxhZ1RyaWdnZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50GmkKEkZsYWdUcmlnZ2VyV2l0aFVybBJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiMQoZRmxhZ1RyaWdnZXJXZWJob29rUmVxdWVzdBIUCgV0b2tlbhgBIAEoCVIFdG9rZW4iHAoaRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UymjkKDkZlYXR1cmVTZXJ2aWNlElsKCkdldEZlYXR1cmUSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRGZWF0dXJlUmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldEZlYXR1cmVSZXNwb25zZSIAEl4KC0dldEZlYXR1cmVzEiUuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXF1ZXN0GiYuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXNwb25zZSIAEmEKDExpc3RGZWF0dXJlcxImLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QaJy5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXNwb25zZSIAEnYKE0xpc3RFbmFibGVkRmVhdHVyZXMSLS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RW5hYmxlZEZlYXR1cmVzUmVxdWVzdBouLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZSIAEmQKDUNyZWF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5DcmVhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZUZlYXR1cmVSZXNwb25zZSIAEmQKDVVwZGF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVSZXNwb25zZSIAEmcKDUVuYWJsZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5FbmFibGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmoKDkRpc2FibGVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmcKDkFyY2hpdmVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEm0KEFVuYXJjaGl2ZUZlYXR1cmUSKi5idWNrZXRlZXIuZmVhdHVyZS5VbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEmQKDURlbGV0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5EZWxldGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVSZXNwb25zZSIAEnkKFFVwZGF0ZUZlYXR1cmVEZXRhaWxzEi4uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXF1ZXN0Gi8uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSIAEoIBChdVcGRhdGVGZWF0dXJlVmFyaWF0aW9ucxIxLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVxdWVzdBoyLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVzcG9uc2UiABJ/ChZVcGRhdGVGZWF0dXJlVGFyZ2V0aW5nEjAuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlVGFyZ2V0aW5nUmVzcG9uc2UiABJhCgxDbG9uZUZlYXR1cmUSJi5idWNrZXRlZXIuZmVhdHVyZS5DbG9uZUZlYXR1cmVSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlUmVzcG9uc2UiABKmBAoNQ3JlYXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlU2VnbWVudFJlc3BvbnNlIsEDkkGnAwoHc2VnbWVudBIGQ3JlYXRlGhFDcmVhdGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuY3JlYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCECILL3YxL3NlZ21lbnQ6ASoSkQQKCkdldFNlZ21lbnQSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRTZWdtZW50UmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldFNlZ21lbnRSZXNwb25zZSK1A5JBngMKB3NlZ21lbnQSA0dldBoOR2V0IGEgc2VnbWVudC4qEndlYi52MS5zZWdtZW50LmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg0SCy92MS9zZWdtZW50EpoECgxMaXN0U2VnbWVudHMSJi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVzcG9uc2UiuAOSQaADCgdzZWdtZW50EgRMaXN0Gg5MaXN0IHNlZ21lbnRzLioTd2ViLnYxLnNlZ21lbnQubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg4SDC92MS9zZWdtZW50cxKjBAoNRGVsZXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFJlc3BvbnNlIr4DkkGnAwoHc2VnbWVudBIGRGVsZXRlGhFEZWxldGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuZGVsZXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDSoLL3YxL3NlZ21lbnQSpgQKDVVwZGF0ZVNlZ21lbnQSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVTZWdtZW50UmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZVNlZ21lbnRSZXNwb25zZSLBA5JBpwMKB3NlZ21lbnQSBlVwZGF0ZRoRVXBkYXRlIGEgc2VnbWVudC4qFXdlYi52MS5zZWdtZW50LnVwZGF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhAyCy92MS9zZWdtZW50OgEqEmoKDkFkZFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEnMKEURlbGV0ZVNlZ21lbnRVc2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEmoKDkdldFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEm0KEExpc3RTZWdtZW50VXNlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudFVzZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RTZWdtZW50VXNlcnNSZXNwb25zZSIAEuwEChZCdWxrVXBsb2FkU2VnbWVudFVzZXJzEjAuYnVja2V0ZWVyLmZlYXR1cmUuQnVsa1VwbG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVzcG9uc2Ui7AOSQcADCgdzZWdtZW50EgtCdWxrIHVwbG9hZBoaQnVsayB1cGxvYWQgc2VnbWVudCB1c2Vycy4qIHdlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfdXBsb2FkSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCIiIdL3YxL3NlZ21lbnRfdXNlcnMvYnVsa191cGxvYWQ6ASoS9wQKGEJ1bGtEb3dubG9hZFNlZ21lbnRVc2VycxIyLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMy5idWNrZXRlZXIuZmVhdHVyZS5CdWxrRG93bmxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSLxA5JBxgMKB3NlZ21lbnQSDUJ1bGsgZG93bmxvYWQaHEJ1bGsgZG93bmxvYWQgc2VnbWVudCB1c2Vycy4qIndlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfZG93bmxvYWRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIhEh8vdjEvc2VnbWVudF91c2Vycy9idWxrX2Rvd25sb2FkEm0KEEV2YWx1YXRlRmVhdHVyZXMSKi5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0ZUZlYXR1cmVzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRlRmVhdHVyZXNSZXNwb25zZSIAElUKCExpc3RUYWdzEiIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXF1ZXN0GiMuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXNwb25zZSIAEnAKEUNyZWF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEVVwZGF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEUVuYWJsZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnMKEkRpc2FibGVGbGFnVHJpZ2dlchIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlclJlcXVlc3QaLS5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEFJlc2V0RmxhZ1RyaWdnZXISKi5idWNrZXRlZXIuZmVhdHVyZS5SZXNldEZsYWdUcmlnZ2VyUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEURlbGV0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEmcKDkdldEZsYWdUcmlnZ2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEExpc3RGbGFnVHJpZ2dlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZSIAEpQBChJGbGFnVHJpZ2dlcldlYmhvb2sSLC5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlcldlYmhvb2tSZXF1ZXN0Gi0uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UiIYLT5JMCGyIZL3dlYmhvb2svdHJpZ2dlcnMve3Rva2VufUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCpwDChVwcm90by9wdXNoL3B1c2gucHJvdG8SDmJ1Y2tldGVlci5wdXNoIroCCgRQdXNoEg4KAmlkGAEgASgJUgJpZBISCgR0YWdzGAMgAygJUgR0YWdzEhgKB2RlbGV0ZWQYBCABKAhSB2RlbGV0ZWQSEgoEbmFtZRgFIAEoCVIEbmFtZRIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0Ei4KE2ZjbV9zZXJ2aWNlX2FjY291bnQYCCABKAlSEWZjbVNlcnZpY2VBY2NvdW50EhoKCGRpc2FibGVkGAkgASgIUghkaXNhYmxlZBIlCg5lbnZpcm9ubWVudF9pZBgKIAEoCVINZW52aXJvbm1lbnRJZBIpChBlbnZpcm9ubWVudF9uYW1lGAsgASgJUg9lbnZpcm9ubWVudE5hbWVKBAgCEANCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3B1c2hiBnByb3RvMwrqAgoYcHJvdG8vcHVzaC9jb21tYW5kLnByb3RvEg5idWNrZXRlZXIucHVzaCJxChFDcmVhdGVQdXNoQ29tbWFuZBISCgR0YWdzGAIgAygJUgR0YWdzEhIKBG5hbWUYAyABKAlSBG5hbWUSLgoTZmNtX3NlcnZpY2VfYWNjb3VudBgEIAEoDFIRZmNtU2VydmljZUFjY291bnRKBAgBEAIiKAoSQWRkUHVzaFRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiKwoVRGVsZXRlUHVzaFRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiEwoRRGVsZXRlUHVzaENvbW1hbmQiJwoRUmVuYW1lUHVzaENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZUIuWixnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vcHVzaGIGcHJvdG8zCskhChhwcm90by9wdXNoL3NlcnZpY2UucHJvdG8SDmJ1Y2tldGVlci5wdXNoGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8aFXByb3RvL3B1c2gvcHVzaC5wcm90bxoYcHJvdG8vcHVzaC9jb21tYW5kLnByb3RvItkBChFDcmVhdGVQdXNoUmVxdWVzdBI/Cgdjb21tYW5kGAIgASgLMiEuYnVja2V0ZWVyLnB1c2guQ3JlYXRlUHVzaENvbW1hbmRCAhgBUgdjb21tYW5kEhIKBHRhZ3MYAyADKAlSBHRhZ3MSEgoEbmFtZRgEIAEoCVIEbmFtZRIuChNmY21fc2VydmljZV9hY2NvdW50GAUgASgMUhFmY21TZXJ2aWNlQWNjb3VudBIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiI+ChJDcmVhdGVQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2gioQQKEUxpc3RQdXNoZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISRAoIb3JkZXJfYnkYBCABKA4yKS5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5ElkKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjIwLmJ1Y2tldGVlci5wdXNoLkxpc3RQdXNoZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBIlCg5lbnZpcm9ubWVudF9pZBgHIAEoCVINZW52aXJvbm1lbnRJZBInCg9vcmdhbml6YXRpb25faWQYCCABKAlSDm9yZ2FuaXphdGlvbklkEjYKCGRpc2FibGVkGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQiXAoHT3JkZXJCeRILCgdERUZBVUxUEAASCAoETkFNRRABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMSDwoLRU5WSVJPTk1FTlQQBBIJCgVTVEFURRAFIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQAUoECAEQAiJ7ChJMaXN0UHVzaGVzUmVzcG9uc2USLAoGcHVzaGVzGAEgAygLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIGcHVzaGVzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50Io0BChFEZWxldGVQdXNoUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSOwoHY29tbWFuZBgDIAEoCzIhLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhQKEkRlbGV0ZVB1c2hSZXNwb25zZSLuAwoRVXBkYXRlUHVzaFJlcXVlc3QSEwoCaWQYAiABKAlCA+BBAlICaWQSWQoVYWRkX3B1c2hfdGFnc19jb21tYW5kGAMgASgLMiIuYnVja2V0ZWVyLnB1c2guQWRkUHVzaFRhZ3NDb21tYW5kQgIYAVISYWRkUHVzaFRhZ3NDb21tYW5kEmIKGGRlbGV0ZV9wdXNoX3RhZ3NfY29tbWFuZBgEIAEoCzIlLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hUYWdzQ29tbWFuZEICGAFSFWRlbGV0ZVB1c2hUYWdzQ29tbWFuZBJVChNyZW5hbWVfcHVzaF9jb21tYW5kGAUgASgLMiEuYnVja2V0ZWVyLnB1c2guUmVuYW1lUHVzaENvbW1hbmRCAhgBUhFyZW5hbWVQdXNoQ29tbWFuZBISCgR0YWdzGAYgAygJUgR0YWdzEjAKBG5hbWUYByABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSBG5hbWUSKgoOZW52aXJvbm1lbnRfaWQYCCABKAlCA+BBAlINZW52aXJvbm1lbnRJZBI2CghkaXNhYmxlZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkSgQIARACIj4KElVwZGF0ZVB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaCJRCg5HZXRQdXNoUmVxdWVzdBIqCg5lbnZpcm9ubWVudF9pZBgBIAEoCUID4EECUg1lbnZpcm9ubWVudElkEhMKAmlkGAIgASgJQgPgQQJSAmlkIjsKD0dldFB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaDKAEQoLUHVzaFNlcnZpY2UShAQKCkxpc3RQdXNoZXMSIS5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdBoiLmJ1Y2tldGVlci5wdXNoLkxpc3RQdXNoZXNSZXNwb25zZSKuA5JBmAMKBHB1c2gSBExpc3QaDExpc3QgcHVzaGVzLioQd2ViLnYxLnB1c2gubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgwSCi92MS9wdXNoZXMSiwQKCkNyZWF0ZVB1c2gSIS5idWNrZXRlZXIucHVzaC5DcmVhdGVQdXNoUmVxdWVzdBoiLmJ1Y2tldGVlci5wdXNoLkNyZWF0ZVB1c2hSZXNwb25zZSK1A5JBngMKBHB1c2gSBkNyZWF0ZRoOQ3JlYXRlIGEgcHVzaC4qEndlYi52MS5wdXNoLmNyZWF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg0iCC92MS9wdXNoOgEqEosECgpVcGRhdGVQdXNoEiEuYnVja2V0ZWVyLnB1c2guVXBkYXRlUHVzaFJlcXVlc3QaIi5idWNrZXRlZXIucHVzaC5VcGRhdGVQdXNoUmVzcG9uc2UitQOSQZ4DCgRwdXNoEgZVcGRhdGUaDlVwZGF0ZSBhIHB1c2guKhJ3ZWIudjEucHVzaC51cGRhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwINMggvdjEvcHVzaDoBKhL2AwoHR2V0UHVzaBIeLmJ1Y2tldGVlci5wdXNoLkdldFB1c2hSZXF1ZXN0Gh8uYnVja2V0ZWVyLnB1c2guR2V0UHVzaFJlc3BvbnNlIqkDkkGVAwoEcHVzaBIDR2V0GgtHZXQgYSBwdXNoLioPd2ViLnYxLnB1c2guZ2V0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCChIIL3YxL3B1c2gSVQoKRGVsZXRlUHVzaBIhLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hSZXF1ZXN0GiIuYnVja2V0ZWVyLnB1c2guRGVsZXRlUHVzaFJlc3BvbnNlIgBCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3B1c2hiBnByb3RvMwrnAwojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCLpAgoNRW52aXJvbm1lbnRWMhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SHQoKcHJvamVjdF9pZBgFIAEoCVIJcHJvamVjdElkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EicKD29yZ2FuaXphdGlvbl9pZBgJIAEoCVIOb3JnYW5pemF0aW9uSWQSJwoPcmVxdWlyZV9jb21tZW50GAogASgIUg5yZXF1aXJlQ29tbWVudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYCyABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMK/QMKH3Byb3RvL2Vudmlyb25tZW50L3Byb2plY3QucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCKDAwoHUHJvamVjdBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZRInCg9vcmdhbml6YXRpb25faWQYCiABKAlSDm9yZ2FuaXphdGlvbklkEisKEWVudmlyb25tZW50X2NvdW50GAsgASgFUhBlbnZpcm9ubWVudENvdW50EiwKEmZlYXR1cmVfZmxhZ19jb3VudBgMIAEoBVIQZmVhdHVyZUZsYWdDb3VudEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqvBAokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQisAMKDE9yZ2FuaXphdGlvbhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBIhCgxzeXN0ZW1fYWRtaW4YCiABKAhSC3N5c3RlbUFkbWluEiMKDXByb2plY3RfY291bnQYCyABKAVSDHByb2plY3RDb3VudBIrChFlbnZpcm9ubWVudF9jb3VudBgMIAEoBVIQZW52aXJvbm1lbnRDb3VudBIdCgp1c2VyX2NvdW50GA0gASgFUgl1c2VyQ291bnQSHwoLb3duZXJfZW1haWwYDiABKAlSCm93bmVyRW1haWxCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKkAMKIXByb3RvL2FjY291bnQvc2VhcmNoX2ZpbHRlci5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQi6QEKDFNlYXJjaEZpbHRlchIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIUCgVxdWVyeRgDIAEoCVIFcXVlcnkSUQoSZmlsdGVyX3RhcmdldF90eXBlGAQgASgOMiMuYnVja2V0ZWVyLmFjY291bnQuRmlsdGVyVGFyZ2V0VHlwZVIQZmlsdGVyVGFyZ2V0VHlwZRIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZBIlCg5kZWZhdWx0X2ZpbHRlchgGIAEoCFINZGVmYXVsdEZpbHRlcioxChBGaWx0ZXJUYXJnZXRUeXBlEgsKB1VOS05PV04QABIQCgxGRUFUVVJFX0ZMQUcQAUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCtQTChtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvGiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8iqwIKB0FjY291bnQSDgoCaWQYASABKAlSAmlkEhQKBWVtYWlsGAIgASgJUgVlbWFpbBISCgRuYW1lGAMgASgJUgRuYW1lEjMKBHJvbGUYBCABKA4yHy5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZCI5CgRSb2xlEgoKBlZJRVdFUhAAEgoKBkVESVRPUhABEgkKBU9XTkVSEAISDgoKVU5BU1NJR05FRBBjOgIYASK8CAoJQWNjb3VudFYyEhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEigKEGF2YXRhcl9pbWFnZV91cmwYAyABKAlSDmF2YXRhckltYWdlVXJsEicKD29yZ2FuaXphdGlvbl9pZBgEIAEoCVIOb3JnYW5pemF0aW9uSWQSWwoRb3JnYW5pemF0aW9uX3JvbGUYBSABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEhoKCGRpc2FibGVkGAcgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0EkYKDnNlYXJjaF9maWx0ZXJzGAogAygLMh8uYnVja2V0ZWVyLmFjY291bnQuU2VhcmNoRmlsdGVyUg1zZWFyY2hGaWx0ZXJzEh0KCmZpcnN0X25hbWUYCyABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYDCABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGA0gASgJUghsYW5ndWFnZRIbCglsYXN0X3NlZW4YDiABKANSCGxhc3RTZWVuEigKEGF2YXRhcl9maWxlX3R5cGUYDyABKAlSDmF2YXRhckZpbGVUeXBlEiEKDGF2YXRhcl9pbWFnZRgQIAEoDFILYXZhdGFySW1hZ2USKwoRZW52aXJvbm1lbnRfY291bnQYESABKAVSEGVudmlyb25tZW50Q291bnQSEgoEdGFncxgSIAMoCVIEdGFncxrXAQoEUm9sZSJZCgtFbnZpcm9ubWVudBIaChZFbnZpcm9ubWVudF9VTkFTU0lHTkVEEAASFgoSRW52aXJvbm1lbnRfVklFV0VSEAESFgoSRW52aXJvbm1lbnRfRURJVE9SEAIidAoMT3JnYW5pemF0aW9uEhsKF09yZ2FuaXphdGlvbl9VTkFTU0lHTkVEEAASFwoTT3JnYW5pemF0aW9uX01FTUJFUhABEhYKEk9yZ2FuaXphdGlvbl9BRE1JThACEhYKEk9yZ2FuaXphdGlvbl9PV05FUhADGnsKD0Vudmlyb25tZW50Um9sZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBJBCgRyb2xlGAIgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGUi6gYKDkNvbnNvbGVBY2NvdW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmF2YXRhcl91cmwYAyABKAlSCWF2YXRhclVybBImCg9pc19zeXN0ZW1fYWRtaW4YBCABKAhSDWlzU3lzdGVtQWRtaW4SRwoMb3JnYW5pemF0aW9uGAUgASgLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblIMb3JnYW5pemF0aW9uElsKEW9yZ2FuaXphdGlvbl9yb2xlGAYgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlEl4KEWVudmlyb25tZW50X3JvbGVzGAcgAygLMjEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnQuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEkYKDnNlYXJjaF9maWx0ZXJzGAggAygLMh8uYnVja2V0ZWVyLmFjY291bnQuU2VhcmNoRmlsdGVyUg1zZWFyY2hGaWx0ZXJzEh0KCmZpcnN0X25hbWUYCSABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCiABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAsgASgJUghsYW5ndWFnZRIoChBhdmF0YXJfZmlsZV90eXBlGAwgASgJUg5hdmF0YXJGaWxlVHlwZRIhCgxhdmF0YXJfaW1hZ2UYDSABKAxSC2F2YXRhckltYWdlEhsKCWxhc3Rfc2VlbhgOIAEoA1IIbGFzdFNlZW4a1gEKD0Vudmlyb25tZW50Um9sZRJGCgtlbnZpcm9ubWVudBgBIAEoCzIkLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFYyUgtlbnZpcm9ubWVudBI4Cgdwcm9qZWN0GAIgASgLMh4uYnVja2V0ZWVyLmVudmlyb25tZW50LlByb2plY3RSB3Byb2plY3QSQQoEcm9sZRgDIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLkVudmlyb25tZW50UgRyb2xlQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMK5gYKG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQaI3Byb3RvL2Vudmlyb25tZW50L2Vudmlyb25tZW50LnByb3RvIrsDCgZBUElLZXkSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSMgoEcm9sZRgDIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Eh4KCm1haW50YWluZXIYByABKAlSCm1haW50YWluZXISFwoHYXBpX2tleRgIIAEoCVIGYXBpS2V5EiAKC2Rlc2NyaXB0aW9uGAkgASgJUgtkZXNjcmlwdGlvbhIpChBlbnZpcm9ubWVudF9uYW1lGAogASgJUg9lbnZpcm9ubWVudE5hbWUieQoEUm9sZRILCgdVTktOT1dOEAASDgoKU0RLX0NMSUVOVBABEg4KClNES19TRVJWRVIQAhIYChRQVUJMSUNfQVBJX1JFQURfT05MWRADEhQKEFBVQkxJQ19BUElfV1JJVEUQBBIUChBQVUJMSUNfQVBJX0FETUlOEAUilQIKEUVudmlyb25tZW50QVBJS2V5EjIKB2FwaV9rZXkYAiABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleRIxChRlbnZpcm9ubWVudF9kaXNhYmxlZBgDIAEoCFITZW52aXJvbm1lbnREaXNhYmxlZBIhCgpwcm9qZWN0X2lkGAQgASgJQgIYAVIJcHJvamVjdElkEkYKC2Vudmlyb25tZW50GAUgASgLMiQuYnVja2V0ZWVyLmVudmlyb25tZW50LkVudmlyb25tZW50VjJSC2Vudmlyb25tZW50EigKEHByb2plY3RfdXJsX2NvZGUYBiABKAlSDnByb2plY3RVcmxDb2RlSgQIARACQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMKnBIKG3Byb3RvL2FjY291bnQvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQaG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvGiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8ikAMKFkNyZWF0ZUFjY291bnRWMkNvbW1hbmQSFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBCABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBSADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEh0KCmZpcnN0X25hbWUYBiABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYByABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAggASgJUghsYW5ndWFnZRISCgR0YWdzGAkgAygJUgR0YWdzIjAKGkNoYW5nZUFjY291bnRWMk5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiQAofQ2hhbmdlQWNjb3VudFYyRmlyc3ROYW1lQ29tbWFuZBIdCgpmaXJzdF9uYW1lGAEgASgJUglmaXJzdE5hbWUiPQoeQ2hhbmdlQWNjb3VudFYyTGFzdE5hbWVDb21tYW5kEhsKCWxhc3RfbmFtZRgBIAEoCVIIbGFzdE5hbWUiPAoeQ2hhbmdlQWNjb3VudFYyTGFuZ3VhZ2VDb21tYW5kEhoKCGxhbmd1YWdlGAEgASgJUghsYW5ndWFnZSJQCiRDaGFuZ2VBY2NvdW50VjJBdmF0YXJJbWFnZVVybENvbW1hbmQSKAoQYXZhdGFyX2ltYWdlX3VybBgBIAEoCVIOYXZhdGFySW1hZ2VVcmwiawocQ2hhbmdlQWNjb3VudFYyQXZhdGFyQ29tbWFuZBIhCgxhdmF0YXJfaW1hZ2UYASABKAxSC2F2YXRhckltYWdlEigKEGF2YXRhcl9maWxlX3R5cGUYAiABKAlSDmF2YXRhckZpbGVUeXBlIjAKGkNoYW5nZUFjY291bnRWMlRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiPQoeQ2hhbmdlQWNjb3VudFYyTGFzdFNlZW5Db21tYW5kEhsKCWxhc3Rfc2VlbhgBIAEoA1IIbGFzdFNlZW4ibAomQ2hhbmdlQWNjb3VudFYyT3JnYW5pemF0aW9uUm9sZUNvbW1hbmQSQgoEcm9sZRgBIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIEcm9sZSKlAgomQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmQSQgoFcm9sZXMYASADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUgVyb2xlcxJiCgp3cml0ZV90eXBlGAIgASgOMkMuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmQuV3JpdGVUeXBlUgl3cml0ZVR5cGUiUwoJV3JpdGVUeXBlEhkKFVdyaXRlVHlwZV9VTlNQRUNJRklFRBAAEhYKEldyaXRlVHlwZV9PVkVSUklERRABEhMKD1dyaXRlVHlwZV9QQVRDSBACIhgKFkVuYWJsZUFjY291bnRWMkNvbW1hbmQiGQoXRGlzYWJsZUFjY291bnRWMkNvbW1hbmQiGAoWRGVsZXRlQWNjb3VudFYyQ29tbWFuZCJdChNDcmVhdGVBUElLZXlDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUSMgoEcm9sZRgCIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlIi0KF0NoYW5nZUFQSUtleU5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiFQoTRW5hYmxlQVBJS2V5Q29tbWFuZCIWChREaXNhYmxlQVBJS2V5Q29tbWFuZCLmAQoZQ3JlYXRlU2VhcmNoRmlsdGVyQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lEhQKBXF1ZXJ5GAIgASgJUgVxdWVyeRJRChJmaWx0ZXJfdGFyZ2V0X3R5cGUYAyABKA4yIy5idWNrZXRlZXIuYWNjb3VudC5GaWx0ZXJUYXJnZXRUeXBlUhBmaWx0ZXJUYXJnZXRUeXBlEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkEiUKDmRlZmF1bHRfZmlsdGVyGAUgASgIUg1kZWZhdWx0RmlsdGVyIkMKHUNoYW5nZVNlYXJjaEZpbHRlck5hbWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIkYKHkNoYW5nZVNlYXJjaEZpbHRlclF1ZXJ5Q29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFAoFcXVlcnkYAiABKAlSBXF1ZXJ5IlkKIENoYW5nZURlZmF1bHRTZWFyY2hGaWx0ZXJDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIlCg5kZWZhdWx0X2ZpbHRlchgCIAEoCFINZGVmYXVsdEZpbHRlciIrChlEZWxldGVTZWFyY2hGaWx0ZXJDb21tYW5kEg4KAmlkGAEgASgJUgJpZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCta/AQobcHJvdG8vYWNjb3VudC9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxobcHJvdG8vYWNjb3VudC9jb21tYW5kLnByb3RvGiRwcm90by9lbnZpcm9ubWVudC9vcmdhbml6YXRpb24ucHJvdG8iNwoMR2V0TWVSZXF1ZXN0EicKD29yZ2FuaXphdGlvbl9pZBgBIAEoCVIOb3JnYW5pemF0aW9uSWQiTAoNR2V0TWVSZXNwb25zZRI7CgdhY2NvdW50GAEgASgLMiEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnRSB2FjY291bnQiGwoZR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdCI4CiBHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiZwoaR2V0TXlPcmdhbml6YXRpb25zUmVzcG9uc2USSQoNb3JnYW5pemF0aW9ucxgBIAMoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDW9yZ2FuaXphdGlvbnMiggQKFkNyZWF0ZUFjY291bnRWMlJlcXVlc3QSJwoPb3JnYW5pemF0aW9uX2lkGAEgASgJUg5vcmdhbml6YXRpb25JZBJHCgdjb21tYW5kGAIgASgLMikuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQSFAoFZW1haWwYAyABKAlSBWVtYWlsEhIKBG5hbWUYBCABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgFIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYByADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEh0KCmZpcnN0X25hbWUYCCABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCSABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAogASgJUghsYW5ndWFnZRISCgR0YWdzGAsgAygJUgR0YWdzIlEKF0NyZWF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkVuYWJsZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIlEKF0VuYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiogEKF0Rpc2FibGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEkgKB2NvbW1hbmQYAyABKAsyKi5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQiUgoYRGlzYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkRlbGV0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIhkKF0RlbGV0ZUFjY291bnRWMlJlc3BvbnNlIt0QChZVcGRhdGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEmEKE2NoYW5nZV9uYW1lX2NvbW1hbmQYAyABKAsyLS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJOYW1lQ29tbWFuZEICGAFSEWNoYW5nZU5hbWVDb21tYW5kEnYKGWNoYW5nZV9hdmF0YXJfdXJsX2NvbW1hbmQYBCABKAsyNy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJJbWFnZVVybENvbW1hbmRCAhgBUhZjaGFuZ2VBdmF0YXJVcmxDb21tYW5kEoYBCiBjaGFuZ2Vfb3JnYW5pemF0aW9uX3JvbGVfY29tbWFuZBgFIAEoCzI5LmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMk9yZ2FuaXphdGlvblJvbGVDb21tYW5kQgIYAVIdY2hhbmdlT3JnYW5pemF0aW9uUm9sZUNvbW1hbmQShgEKIGNoYW5nZV9lbnZpcm9ubWVudF9yb2xlc19jb21tYW5kGAYgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmRCAhgBUh1jaGFuZ2VFbnZpcm9ubWVudFJvbGVzQ29tbWFuZBJxChljaGFuZ2VfZmlyc3RfbmFtZV9jb21tYW5kGAcgASgLMjIuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRmlyc3ROYW1lQ29tbWFuZEICGAFSFmNoYW5nZUZpcnN0TmFtZUNvbW1hbmQSbgoYY2hhbmdlX2xhc3RfbmFtZV9jb21tYW5kGAggASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFzdE5hbWVDb21tYW5kQgIYAVIVY2hhbmdlTGFzdE5hbWVDb21tYW5kEm0KF2NoYW5nZV9sYW5ndWFnZV9jb21tYW5kGAkgASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFuZ3VhZ2VDb21tYW5kQgIYAVIVY2hhbmdlTGFuZ3VhZ2VDb21tYW5kEm4KGGNoYW5nZV9sYXN0X3NlZW5fY29tbWFuZBgKIAEoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMkxhc3RTZWVuQ29tbWFuZEICGAFSFWNoYW5nZUxhc3RTZWVuQ29tbWFuZBJnChVjaGFuZ2VfYXZhdGFyX2NvbW1hbmQYCyABKAsyLy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJDb21tYW5kQgIYAVITY2hhbmdlQXZhdGFyQ29tbWFuZBIwCgRuYW1lGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEkYKEGF2YXRhcl9pbWFnZV91cmwYDSABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSDmF2YXRhckltYWdlVXJsEmwKEW9yZ2FuaXphdGlvbl9yb2xlGA4gASgLMj8uYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5Pcmdhbml6YXRpb25Sb2xlVmFsdWVSEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYDyADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEjsKCmZpcnN0X25hbWUYECABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCWZpcnN0TmFtZRI5CglsYXN0X25hbWUYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCGxhc3ROYW1lEjgKCGxhbmd1YWdlGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUghsYW5ndWFnZRI4CglsYXN0X3NlZW4YEyABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVIIbGFzdFNlZW4SUQoGYXZhdGFyGBQgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5BY2NvdW50VjJBdmF0YXJSBmF2YXRhchI2CghkaXNhYmxlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkEhIKBHRhZ3MYFiADKAlSBHRhZ3MSYQoTY2hhbmdlX3RhZ3NfY29tbWFuZBgXIAEoCzItLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMlRhZ3NDb21tYW5kQgIYAVIRY2hhbmdlVGFnc0NvbW1hbmQaXgoPQWNjb3VudFYyQXZhdGFyEiEKDGF2YXRhcl9pbWFnZRgBIAEoDFILYXZhdGFySW1hZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgCIAEoCVIOYXZhdGFyRmlsZVR5cGUaWwoVT3JnYW5pemF0aW9uUm9sZVZhbHVlEkIKBHJvbGUYASABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SBHJvbGUiUQoXVXBkYXRlQWNjb3VudFYyUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCJUChNHZXRBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkIk4KFEdldEFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiYQoiR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiXQojR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCKpBgoVTGlzdEFjY291bnRzVjJSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISJwoPb3JnYW5pemF0aW9uX2lkGAMgASgJUg5vcmdhbml6YXRpb25JZBJLCghvcmRlcl9ieRgEIAEoDjIwLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmAKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI3LmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZBJIChFvcmdhbml6YXRpb25fcm9sZRgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhBvcmdhbml6YXRpb25Sb2xlEkMKDmVudmlyb25tZW50X2lkGAkgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUg1lbnZpcm9ubWVudElkEkYKEGVudmlyb25tZW50X3JvbGUYCiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIPZW52aXJvbm1lbnRSb2xlEhIKBHRhZ3MYCyADKAlSBHRhZ3MikwEKB09yZGVyQnkSCwoHREVGQVVMVBAAEgkKBUVNQUlMEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIVChFPUkdBTklaQVRJT05fUk9MRRAEEhUKEUVOVklST05NRU5UX0NPVU5UEAUSDQoJTEFTVF9TRUVOEAYSCQoFU1RBVEUQBxIICgRUQUdTEAgiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABIosBChZMaXN0QWNjb3VudHNWMlJlc3BvbnNlEjgKCGFjY291bnRzGAEgAygLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUghhY2NvdW50cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAgoTQ3JlYXRlQVBJS2V5UmVxdWVzdBJECgdjb21tYW5kGAEgASgLMiYuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQVBJS2V5Q29tbWFuZEICGAFSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWQSEgoEbmFtZRgEIAEoCVIEbmFtZRIyCgRyb2xlGAUgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSHgoKbWFpbnRhaW5lchgGIAEoCVIKbWFpbnRhaW5lchIgCgtkZXNjcmlwdGlvbhgHIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiSgoUQ3JlYXRlQVBJS2V5UmVzcG9uc2USMgoHYXBpX2tleRgBIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5IpwBChdDaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhoKGENoYW5nZUFQSUtleU5hbWVSZXNwb25zZSKUAQoTRW5hYmxlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQAoHY29tbWFuZBgCIAEoCzImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFgoURW5hYmxlQVBJS2V5UmVzcG9uc2UilgEKFERpc2FibGVBUElLZXlSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJBCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGlzYWJsZUFQSUtleVJlc3BvbnNlIk8KEEdldEFQSUtleVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkcKEUdldEFQSUtleVJlc3BvbnNlEjIKB2FwaV9rZXkYASABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleSLmBAoSTGlzdEFQSUtleXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSAoIb3JkZXJfYnkYBCABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJdCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSKQoOZW52aXJvbm1lbnRfaWQYCCABKAlCAhgBUg1lbnZpcm9ubWVudElkEicKD2Vudmlyb25tZW50X2lkcxgJIAMoCVIOZW52aXJvbm1lbnRJZHMSLAoPb3JnYW5pemF0aW9uX2lkGAogASgJQgPgQQJSDm9yZ2FuaXphdGlvbklkImYKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBFJPTEUQBBIPCgtFTlZJUk9OTUVOVBAFEgkKBVNUQVRFEAYiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIAxAEIoQBChNMaXN0QVBJS2V5c1Jlc3BvbnNlEjQKCGFwaV9rZXlzGAEgAygLMhkuYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5UgdhcGlLZXlzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IjYKG0dldEVudmlyb25tZW50QVBJS2V5UmVxdWVzdBIXCgdhcGlfa2V5GAIgASgJUgZhcGlLZXkidAocR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZRJUChNlbnZpcm9ubWVudF9hcGlfa2V5GAEgASgLMiQuYnVja2V0ZWVyLmFjY291bnQuRW52aXJvbm1lbnRBUElLZXlSEWVudmlyb25tZW50QXBpS2V5IskBChlDcmVhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEkYKB2NvbW1hbmQYBCABKAsyLC5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJDb21tYW5kUgdjb21tYW5kIhwKGkNyZWF0ZVNlYXJjaEZpbHRlclJlc3BvbnNlIsADChlVcGRhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEmAKE2NoYW5nZV9uYW1lX2NvbW1hbmQYBCABKAsyMC5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJOYW1lQ29tbWFuZFIRY2hhbmdlTmFtZUNvbW1hbmQSYwoUY2hhbmdlX3F1ZXJ5X2NvbW1hbmQYBSABKAsyMS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJRdWVyeUNvbW1hbmRSEmNoYW5nZVF1ZXJ5Q29tbWFuZBJ2Ch1jaGFuZ2VfZGVmYXVsdF9maWx0ZXJfY29tbWFuZBgGIAEoCzIzLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZURlZmF1bHRTZWFyY2hGaWx0ZXJDb21tYW5kUhpjaGFuZ2VEZWZhdWx0RmlsdGVyQ29tbWFuZCIcChpVcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLJAQoZRGVsZXRlU2VhcmNoRmlsdGVyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZBIlCg5lbnZpcm9ubWVudF9pZBgDIAEoCVINZW52aXJvbm1lbnRJZBJGCgdjb21tYW5kGAQgASgLMiwuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlU2VhcmNoRmlsdGVyQ29tbWFuZFIHY29tbWFuZCIcChpEZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLoAgoTVXBkYXRlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQSMAoEbmFtZRgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb24SMgoEcm9sZRgFIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSPAoKbWFpbnRhaW5lchgHIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIKbWFpbnRhaW5lciIWChRVcGRhdGVBUElLZXlSZXNwb25zZTLOegoOQWNjb3VudFNlcnZpY2USngQKBUdldE1lEh8uYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXF1ZXN0GiAuYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXNwb25zZSLRA5JBswMKB0FjY291bnQSBkdldCBNZRodR2V0IHRoZSB1c2VyIGNvbnNvbGUgYWNjb3VudC4qFXdlYi52MS5hY2NvdW50LmdldF9tZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhQSEi92MS9hY2NvdW50L2dldF9tZRL4BAoSR2V0TXlPcmdhbml6YXRpb25zEiwuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdBotLmJ1Y2tldGVlci5hY2NvdW50LkdldE15T3JnYW5pemF0aW9uc1Jlc3BvbnNlIoQEkkHcAwoHQWNjb3VudBIUR2V0IE15IE9yZ2FuaXphdGlvbnMaLkdldCBhbGwgdGhlIG9yZ2FuaXphdGlvbnMgZm9yIGEgc3BlY2lmaWMgdXNlci4qH3dlYi52MS5hY2NvdW50Lm15X29yZ2FuaXphdGlvbnNKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIeEhwvdjEvYWNjb3VudC9teV9vcmdhbml6YXRpb25zEpYFChlHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsEjMuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zQnlFbWFpbFJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5HZXRNeU9yZ2FuaXphdGlvbnNSZXNwb25zZSKUBJJB4wMKB0FjY291bnQSHUdldCBNeSBPcmdhbml6YXRpb25zIEJ5IEVtYWlsGiNHZXQgYWxsIHRoZSBvcmdhbml6YXRpb25zIGJ5IGVtYWlsLiood2ViLnYxLmFjY291bnQubXlfb3JnYW5pemF0aW9uc19ieV9lbWFpbEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAicSJS92MS9hY2NvdW50L215X29yZ2FuaXphdGlvbnNfYnlfZW1haWwSugYKD0NyZWF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBY2NvdW50VjJSZXNwb25zZSLPBZJBpgUKB0FjY291bnQSBkNyZWF0ZRpcQ3JlYXRlIGFuIGFjY291bnQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbnNvbGUuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmNyZWF0ZV9hY2NvdW50SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2NyZWF0ZV9hY2NvdW50OgEqEs4DCg9FbmFibGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuRW5hYmxlQWNjb3VudFYyUmVzcG9uc2Ui4wKSQboCCgdBY2NvdW50EgZFbmFibGUaXEVuYWJsZSBhbiBhY2NvdW50IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC5lbmFibGVfYWNjb3VudEqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hY2NvdW50OgEqEsIGChBEaXNhYmxlQWNjb3VudFYyEiouYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFjY291bnRWMlJlcXVlc3QaKy5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyUmVzcG9uc2Ui1AWSQaoFCgdBY2NvdW50EgdEaXNhYmxlGl5EaXNhYmxlIGFuIGFjY291bnQgdG8gYmxvY2sgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh53ZWIudjEuYWNjb3VudC5kaXNhYmxlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCICIbL3YxL2FjY291bnQvZGlzYWJsZV9hY2NvdW50OgEqEpwGCg9VcGRhdGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVzcG9uc2UisQWSQYgFCgdBY2NvdW50EgZVcGRhdGUaPlVwZGF0ZSBhbiBhY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC51cGRhdGVfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIfIhovdjEvYWNjb3VudC91cGRhdGVfYWNjb3VudDoBKhKcBgoPRGVsZXRlQWNjb3VudFYyEikuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlQWNjb3VudFYyUmVxdWVzdBoqLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMlJlc3BvbnNlIrEFkkGIBQoHQWNjb3VudBIGRGVsZXRlGj5EZWxldGUgYW4gYWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuZGVsZXRlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvZGVsZXRlX2FjY291bnQ6ASoSrAQKDEdldEFjY291bnRWMhImLmJ1Y2tldGVlci5hY2NvdW50LkdldEFjY291bnRWMlJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJSZXNwb25zZSLKA5JBpwMKB0FjY291bnQSA0dldBoPR2V0IGFuIGFjY291bnQuKhp3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hY2NvdW50Ep0FChtHZXRBY2NvdW50VjJCeUVudmlyb25tZW50SUQSNS5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJCeUVudmlyb25tZW50SURSZXF1ZXN0GjYuYnVja2V0ZWVyLmFjY291bnQuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2UijgSSQdwDCgdBY2NvdW50EhpHZXQgQWNjb3VudCBCeSBFbnZpcm9ubWVudBoeR2V0IGFuIGFjY291bnQgYnkgZW52aXJvbm1lbnQuKil3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudF9ieV9lbnZpcm9ubWVudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAigSJi92MS9hY2NvdW50L2dldF9hY2NvdW50X2J5X2Vudmlyb25tZW50ErYECg5MaXN0QWNjb3VudHNWMhIoLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdBopLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVzcG9uc2UizgOSQakDCgdBY2NvdW50EgRMaXN0Gg5MaXN0IGFjY291bnRzLiocd2ViLnYxLmFjY291bnQubGlzdF9hY2NvdW50c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYWNjb3VudHMSsAYKDENyZWF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBUElLZXlSZXNwb25zZSLOBZJBpQUKB0FQSSBLZXkSBkNyZWF0ZRpbQ3JlYXRlIGFuIEFQSSBrZXkgdG8gYmUgdXNlZCBvbiB0aGUgY2xpZW50IFNESy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuY3JlYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvY3JlYXRlX2FwaV9rZXk6ASoSvAYKEENoYW5nZUFQSUtleU5hbWUSKi5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBorLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVSZXNwb25zZSLOBZJBoAUKB0FQSSBLZXkSE0NoYW5nZSBBUEkgS2V5IE5hbWUaRENoYW5nZSB0aGUgQVBJIEtleSBOYW1lLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKiJ3ZWIudjEuYWNjb3VudC5jaGFuZ2VfYXBpX2tleV9uYW1lSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiQiHy92MS9hY2NvdW50L2NoYW5nZV9hcGlfa2V5X25hbWU6ASoSkwYKDEVuYWJsZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBUElLZXlSZXNwb25zZSKxBZJBiAUKB0FQSSBLZXkSBkVuYWJsZRo+RW5hYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmVuYWJsZV9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hcGlfa2V5OgEqEpoGCg1EaXNhYmxlQVBJS2V5EicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleVJlcXVlc3QaKC5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQVBJS2V5UmVzcG9uc2UitQWSQYsFCgdBUEkgS2V5EgdEaXNhYmxlGj9EaXNhYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHndlYi52MS5hY2NvdW50LmRpc2FibGVfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIgIhsvdjEvYWNjb3VudC9kaXNhYmxlX2FwaV9rZXk6ASoSowQKCUdldEFQSUtleRIjLmJ1Y2tldGVlci5hY2NvdW50LkdldEFQSUtleVJlcXVlc3QaJC5idWNrZXRlZXIuYWNjb3VudC5HZXRBUElLZXlSZXNwb25zZSLKA5JBpwMKB0FQSSBLZXkSA0dldBoPR2V0IGFuIEFQSSBLZXkuKhp3ZWIudjEuYWNjb3VudC5nZXRfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hcGlfa2V5Eq0ECgtMaXN0QVBJS2V5cxIlLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVxdWVzdBomLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVzcG9uc2UizgOSQakDCgdBUEkgS2V5EgRMaXN0Gg5MaXN0IEFQSSBLZXlzLiocd2ViLnYxLmFjY291bnQubGlzdF9hcGlfa2V5c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYXBpX2tleXMS/AQKFEdldEVudmlyb25tZW50QVBJS2V5Ei4uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXF1ZXN0Gi8uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZSKCBJJB0wMKB0FQSSBLZXkSF0dldCBFbnZpcm9ubWVudCBBUEkgS2V5GhtHZXQgYW4gZW52aXJvbm1lbnQgQVBJIEtleS4qJndlYi52MS5hY2NvdW50LmdldF9lbnZpcm9ubWVudF9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJRIjL3YxL2FjY291bnQvZ2V0X2Vudmlyb25tZW50X2FwaV9rZXkSxQYKEkNyZWF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFENyZWF0ZSBTZWFyY2ggRmlsdGVyGkRDcmVhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuY3JlYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvY3JlYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKElVwZGF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFFVwZGF0ZSBTZWFyY2ggRmlsdGVyGkRVcGRhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQudXBkYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvdXBkYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKEkRlbGV0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5EZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFERlbGV0ZSBTZWFyY2ggRmlsdGVyGkREZWxldGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuZGVsZXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvZGVsZXRlX3NlYXJjaF9maWx0ZXI6ASoSmwYKDFVwZGF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBUElLZXlSZXNwb25zZSK5BZJBkAUKB0FQSSBLZXkSDlVwZGF0ZSBBUEkgS2V5Gj5VcGRhdGUgYW4gQVBJIEtleS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQudXBkYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHzIaL3YxL2FjY291bnQvdXBkYXRlX2FwaV9rZXk6ASpCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwr7AQoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvEg9nb29nbGUucHJvdG9idWYiOgoIRHVyYXRpb24SGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbmFub3NCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDUR1cmF0aW9uUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZHVyYXRpb25wYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCsY0Ch5wcm90by9ldmVudC9jbGllbnQvZXZlbnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5jbGllbnQaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvGhpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxoVcHJvdG8vdXNlci91c2VyLnByb3RvInAKBUV2ZW50Eg4KAmlkGAEgASgJUgJpZBIqCgVldmVudBgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBWV2ZW50EiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIpIECg9FdmFsdWF0aW9uRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SFwoHdXNlcl9pZBgEIAEoCVIGdXNlcklkEiEKDHZhcmlhdGlvbl9pZBgFIAEoCVILdmFyaWF0aW9uSWQSKAoEdXNlchgGIAEoCzIULmJ1Y2tldGVlci51c2VyLlVzZXJSBHVzZXISMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SEAoDdGFnGAggASgJUgN0YWcSPQoJc291cmNlX2lkGAkgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YCiABKAlSCnNka1ZlcnNpb24SUQoIbWV0YWRhdGEYCyADKAsyNS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkV2YWx1YXRpb25FdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi3AMKCUdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgDIAEoCVIGdXNlcklkEhQKBXZhbHVlGAQgASgBUgV2YWx1ZRIoCgR1c2VyGAUgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchJDCgtldmFsdWF0aW9ucxgGIAMoCzIdLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRpb25CAhgBUgtldmFsdWF0aW9ucxIQCgN0YWcYByABKAlSA3RhZxI9Cglzb3VyY2VfaWQYCCABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgJIAEoCVIKc2RrVmVyc2lvbhJLCghtZXRhZGF0YRgKIAMoCzIvLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR29hbEV2ZW50Lk1ldGFkYXRhRW50cnlSCG1ldGFkYXRhGjsKDU1ldGFkYXRhRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAgoMTWV0cmljc0V2ZW50EhwKCXRpbWVzdGFtcBgBIAEoA1IJdGltZXN0YW1wEioKBWV2ZW50GAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIFZXZlbnQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBCABKAlSCnNka1ZlcnNpb24STgoIbWV0YWRhdGEYBSADKAsyMi5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk1ldHJpY3NFdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9gEKIEdldEV2YWx1YXRpb25MYXRlbmN5TWV0cmljc0V2ZW50ElwKBmxhYmVscxgBIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvbkxhdGVuY3lNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxI1CghkdXJhdGlvbhgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIIZHVyYXRpb24aOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AToCGAEi1gEKHUdldEV2YWx1YXRpb25TaXplTWV0cmljc0V2ZW50ElkKBmxhYmVscxgBIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvblNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAiABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE6AhgBIrkCChNMYXRlbmN5TWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEk8KBmxhYmVscxgCIAMoCzI3LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTGF0ZW5jeU1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzEjkKCGR1cmF0aW9uGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgIYAVIIZHVyYXRpb24SJQoObGF0ZW5jeV9zZWNvbmQYBCABKAFSDWxhdGVuY3lTZWNvbmQaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLuAQoQU2l6ZU1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJMCgZsYWJlbHMYAiADKAsyNC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAyABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiNQodVGltZW91dEVycm9yQ291bnRNZXRyaWNzRXZlbnQSEAoDdGFnGAEgASgJUgN0YWc6AhgBIjYKHkludGVybmFsRXJyb3JDb3VudE1ldHJpY3NFdmVudBIQCgN0YWcYASABKAlSA3RhZzoCGAEi8QEKIFJlZGlyZWN0aW9uUmVxdWVzdEV4Y2VwdGlvbkV2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElwKBmxhYmVscxgCIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuUmVkaXJlY3Rpb25SZXF1ZXN0RXhjZXB0aW9uRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIucBChtCYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVwoGbGFiZWxzGAIgAygLMj8uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5CYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIusBCh1VbmF1dGhvcml6ZWRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJZCgZsYWJlbHMYAiADKAsyQS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlVuYXV0aG9yaXplZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLlAQoaRm9yYmlkZGVuRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVgoGbGFiZWxzGAIgAygLMj4uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Gb3JiaWRkZW5FcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGU5vdEZvdW5kRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Ob3RGb3VuZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLrAQodUGF5bG9hZFRvb0xhcmdlRXhjZXB0aW9uRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWQoGbGFiZWxzGAIgAygLMkEuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5QYXlsb2FkVG9vTGFyZ2VFeGNlcHRpb25FdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi+QEKJENsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJgCgZsYWJlbHMYAiADKAsySC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkNsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi7wEKH0ludGVybmFsU2VydmVyRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWwoGbGFiZWxzGAIgAygLMkMuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbFNlcnZlckVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASL3AQojU2VydmljZVVuYXZhaWxhYmxlRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSXwoGbGFiZWxzGAIgAygLMkcuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5TZXJ2aWNlVW5hdmFpbGFibGVFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4QEKGFRpbWVvdXRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJUCgZsYWJlbHMYAiADKAsyPC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlRpbWVvdXRFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGUludGVybmFsRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLhAQoYTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElQKBmxhYmVscxgCIAMoCzI8LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLpAQocSW50ZXJuYWxTZGtFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJYCgZsYWJlbHMYAiADKAsyQC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkludGVybmFsU2RrRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuEBChhVbmtub3duRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVAoGbGFiZWxzGAIgAygLMjwuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Vbmtub3duRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIsUBCghPcHNFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkEhcKB2dvYWxfaWQYBSABKAlSBmdvYWxJZBIXCgd1c2VyX2lkGAYgASgJUgZ1c2VySWQiXAoNVXNlckdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFAoFdmFsdWUYAyABKAFSBXZhbHVlKnAKCFNvdXJjZUlkEgsKB1VOS05PV04QABILCgdBTkRST0lEEAESBwoDSU9TEAISCwoDV0VCEAMaAggBEg0KCUdPX1NFUlZFUhAFEg8KC05PREVfU0VSVkVSEAYSDgoKSkFWQVNDUklQVBAHIgQIBBAEKpsBCgVBcGlJZBIPCgtVTktOT1dOX0FQSRAAEhIKDkdFVF9FVkFMVUFUSU9OEAESEwoPR0VUX0VWQUxVQVRJT05TEAISEwoPUkVHSVNURVJfRVZFTlRTEAMSFQoRR0VUX0ZFQVRVUkVfRkxBR1MQBBIVChFHRVRfU0VHTUVOVF9VU0VSUxAFEhUKEVNES19HRVRfVkFSSUFUSU9OEGRCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2NsaWVudGIGcHJvdG8zCtOBAQobcHJvdG8vZ2F0ZXdheS9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuZ2F0ZXdheRocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhVwcm90by91c2VyL3VzZXIucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvGhtwcm90by9mZWF0dXJlL3NlcnZpY2UucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGhpwcm90by9mZWF0dXJlL3RhcmdldC5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGhVwcm90by9wdXNoL3B1c2gucHJvdG8aGHByb3RvL3B1c2gvc2VydmljZS5wcm90bxobcHJvdG8vYWNjb3VudC9zZXJ2aWNlLnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aHnByb3RvL2V2ZW50L2NsaWVudC9ldmVudC5wcm90byINCgtQaW5nUmVxdWVzdCIiCgxQaW5nUmVzcG9uc2USEgoEdGltZRgBIAEoA1IEdGltZSLXAQoWR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBIQCgN0YWcYASABKAlSA3RhZxIoChBmZWF0dXJlX2ZsYWdzX2lkGAIgASgJUg5mZWF0dXJlRmxhZ3NJZBIhCgxyZXF1ZXN0ZWRfYXQYAyABKANSC3JlcXVlc3RlZEF0Ej0KCXNvdXJjZV9pZBgEIAEoDjIgLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU291cmNlSWRSCHNvdXJjZUlkEh8KC3Nka192ZXJzaW9uGAUgASgJUgpzZGtWZXJzaW9uIvwBChdHZXRGZWF0dXJlRmxhZ3NSZXNwb25zZRIoChBmZWF0dXJlX2ZsYWdzX2lkGAEgASgJUg5mZWF0dXJlRmxhZ3NJZBI2CghmZWF0dXJlcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEjkKGWFyY2hpdmVkX2ZlYXR1cmVfZmxhZ19pZHMYAyADKAlSFmFyY2hpdmVkRmVhdHVyZUZsYWdJZHMSIQoMcmVxdWVzdGVkX2F0GAQgASgDUgtyZXF1ZXN0ZWRBdBIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIrwBChZHZXRTZWdtZW50VXNlcnNSZXF1ZXN0Eh8KC3NlZ21lbnRfaWRzGAEgAygJUgpzZWdtZW50SWRzEiEKDHJlcXVlc3RlZF9hdBgCIAEoA1ILcmVxdWVzdGVkQXQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBCABKAlSCnNka1ZlcnNpb24i1QEKF0dldFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEkQKDXNlZ21lbnRfdXNlcnMYASADKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlcnNSDHNlZ21lbnRVc2VycxIuChNkZWxldGVkX3NlZ21lbnRfaWRzGAIgAygJUhFkZWxldGVkU2VnbWVudElkcxIhCgxyZXF1ZXN0ZWRfYXQYAyABKANSC3JlcXVlc3RlZEF0EiEKDGZvcmNlX3VwZGF0ZRgEIAEoCFILZm9yY2VVcGRhdGUi+gMKFUdldEV2YWx1YXRpb25zUmVxdWVzdBIQCgN0YWcYASABKAlSA3RhZxIoCgR1c2VyGAIgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchIuChN1c2VyX2V2YWx1YXRpb25zX2lkGAMgASgJUhF1c2VyRXZhbHVhdGlvbnNJZBIhCgpmZWF0dXJlX2lkGAQgASgJQgIYAVIJZmVhdHVyZUlkEj0KCXNvdXJjZV9pZBgFIAEoDjIgLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU291cmNlSWRSCHNvdXJjZUlkEnwKGXVzZXJfZXZhbHVhdGlvbl9jb25kaXRpb24YBiABKAsyQC5idWNrZXRlZXIuZ2F0ZXdheS5HZXRFdmFsdWF0aW9uc1JlcXVlc3QuVXNlckV2YWx1YXRpb25Db25kaXRpb25SF3VzZXJFdmFsdWF0aW9uQ29uZGl0aW9uEh8KC3Nka192ZXJzaW9uGAcgASgJUgpzZGtWZXJzaW9uGnQKF1VzZXJFdmFsdWF0aW9uQ29uZGl0aW9uEiEKDGV2YWx1YXRlZF9hdBgBIAEoA1ILZXZhbHVhdGVkQXQSNgoXdXNlcl9hdHRyaWJ1dGVzX3VwZGF0ZWQYAiABKAhSFXVzZXJBdHRyaWJ1dGVzVXBkYXRlZCLOAQoWR2V0RXZhbHVhdGlvbnNSZXNwb25zZRI+CgVzdGF0ZRgBIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLlVzZXJFdmFsdWF0aW9ucy5TdGF0ZVIFc3RhdGUSRAoLZXZhbHVhdGlvbnMYAiABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Vc2VyRXZhbHVhdGlvbnNSC2V2YWx1YXRpb25zEi4KE3VzZXJfZXZhbHVhdGlvbnNfaWQYAyABKAlSEXVzZXJFdmFsdWF0aW9uc0lkItEBChRHZXRFdmFsdWF0aW9uUmVxdWVzdBIQCgN0YWcYASABKAlSA3RhZxIoCgR1c2VyGAIgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchIdCgpmZWF0dXJlX2lkGAMgASgJUglmZWF0dXJlSWQSPQoJc291cmNlX2lkGAQgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBSABKAlSCnNka1ZlcnNpb24iVgoVR2V0RXZhbHVhdGlvblJlc3BvbnNlEj0KCmV2YWx1YXRpb24YASABKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgpldmFsdWF0aW9uIq4BChVSZWdpc3RlckV2ZW50c1JlcXVlc3QSNQoGZXZlbnRzGAEgAygLMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5FdmVudFIGZXZlbnRzEh8KC3Nka192ZXJzaW9uGAIgASgJUgpzZGtWZXJzaW9uEj0KCXNvdXJjZV9pZBgDIAEoDjIgLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU291cmNlSWRSCHNvdXJjZUlkIpQCChZSZWdpc3RlckV2ZW50c1Jlc3BvbnNlEk0KBmVycm9ycxgBIAMoCzI1LmJ1Y2tldGVlci5nYXRld2F5LlJlZ2lzdGVyRXZlbnRzUmVzcG9uc2UuRXJyb3JzRW50cnlSBmVycm9ycxo/CgVFcnJvchIcCglyZXRyaWFibGUYASABKAhSCXJldHJpYWJsZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlGmoKC0Vycm9yc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkUKBXZhbHVlGAIgASgLMi8uYnVja2V0ZWVyLmdhdGV3YXkuUmVnaXN0ZXJFdmVudHNSZXNwb25zZS5FcnJvclIFdmFsdWU6AjgBIpwBCgxUcmFja1JlcXVlc3QSFgoGYXBpa2V5GAEgASgJUgZhcGlrZXkSFgoGdXNlcmlkGAIgASgJUgZ1c2VyaWQSFgoGZ29hbGlkGAMgASgJUgZnb2FsaWQSEAoDdGFnGAQgASgJUgN0YWcSHAoJdGltZXN0YW1wGAUgASgDUgl0aW1lc3RhbXASFAoFdmFsdWUYBiABKAFSBXZhbHVlIg8KDVRyYWNrUmVzcG9uc2Ui3QIKFENyZWF0ZUZlYXR1cmVSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhJPCg52YXJpYXRpb25fdHlwZRgEIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRI8Cgp2YXJpYXRpb25zGAUgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zEhIKBHRhZ3MYBiADKAlSBHRhZ3MSLAoSb25fdmFyaWF0aW9uX2luZGV4GAcgASgFUhBvblZhcmlhdGlvbkluZGV4Ei4KE29mZl92YXJpYXRpb25faW5kZXgYCCABKAVSEW9mZlZhcmlhdGlvbkluZGV4Ik0KFUNyZWF0ZUZlYXR1cmVSZXNwb25zZRI0CgdmZWF0dXJlGAEgASgLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIHZmVhdHVyZSIjChFHZXRGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQiSgoSR2V0RmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIvUBChNMaXN0RmVhdHVyZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSQoIb3JkZXJfYnkYAyABKA4yLi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSXgoPb3JkZXJfZGlyZWN0aW9uGAQgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZlYXR1cmVzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24iTgoUTGlzdEZlYXR1cmVzUmVzcG9uc2USNgoIZmVhdHVyZXMYASADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcyKoBQoUVXBkYXRlRmVhdHVyZVJlcXVlc3QSGAoHY29tbWVudBgBIAEoCVIHY29tbWVudBIOCgJpZBgCIAEoCVICaWQSMAoEbmFtZRgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb24SEgoEdGFncxgFIAMoCVIEdGFncxI0CgdlbmFibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIHZW5hYmxlZBI2CghhcmNoaXZlZBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEjwKCnZhcmlhdGlvbnMYCCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSRQoNcHJlcmVxdWlzaXRlcxgJIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIzCgd0YXJnZXRzGAogAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGAsgAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgMIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSQQoNb2ZmX3ZhcmlhdGlvbhgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIMb2ZmVmFyaWF0aW9uIk0KFVVwZGF0ZUZlYXR1cmVSZXNwb25zZRI0CgdmZWF0dXJlGAEgASgLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIHZmVhdHVyZSKQAgoRTGlzdFB1c2hlc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJECghvcmRlcl9ieRgDIAEoDjIpLmJ1Y2tldGVlci5wdXNoLkxpc3RQdXNoZXNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSWQoPb3JkZXJfZGlyZWN0aW9uGAQgASgOMjAuYnVja2V0ZWVyLnB1c2guTGlzdFB1c2hlc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkInsKEkxpc3RQdXNoZXNSZXNwb25zZRIsCgZwdXNoZXMYASADKAsyFC5idWNrZXRlZXIucHVzaC5QdXNoUgZwdXNoZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiawoRQ3JlYXRlUHVzaFJlcXVlc3QSEgoEdGFncxgBIAMoCVIEdGFncxISCgRuYW1lGAIgASgJUgRuYW1lEi4KE2ZjbV9zZXJ2aWNlX2FjY291bnQYAyABKAxSEWZjbVNlcnZpY2VBY2NvdW50Ij4KEkNyZWF0ZVB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaCIgCg5HZXRQdXNoUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQiOwoPR2V0UHVzaFJlc3BvbnNlEigKBHB1c2gYASABKAsyFC5idWNrZXRlZXIucHVzaC5QdXNoUgRwdXNoIoACChFVcGRhdGVQdXNoUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSEgoEdGFncxgCIAMoCVIEdGFncxIwCgRuYW1lGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEpQBCgdkZWxldGVkGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUJekkFbKgdkZWxldGVkMlBpZiB0cnVlLCB0aGUgcHVzaCBub3RpZmljYXRpb24gd2lsbCBiZSBkZWxldGVkIGFuZCBvdGhlciBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkLlIHZGVsZXRlZCI+ChJVcGRhdGVQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2gipQMKFkNyZWF0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSJwoPb3JnYW5pemF0aW9uX2lkGAQgASgJUg5vcmdhbml6YXRpb25JZBJbChFvcmdhbml6YXRpb25fcm9sZRgFIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJZChFlbnZpcm9ubWVudF9yb2xlcxgGIAMoCzIsLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5FbnZpcm9ubWVudFJvbGVSEGVudmlyb25tZW50Um9sZXMSHQoKZmlyc3RfbmFtZRgHIAEoCVIJZmlyc3ROYW1lEhsKCWxhc3RfbmFtZRgIIAEoCVIIbGFzdE5hbWUSGgoIbGFuZ3VhZ2UYCSABKAlSCGxhbmd1YWdlIlEKF0NyZWF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiiQgKFlVwZGF0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSMAoEbmFtZRgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRJGChBhdmF0YXJfaW1hZ2VfdXJsGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUg5hdmF0YXJJbWFnZVVybBJsChFvcmdhbml6YXRpb25fcm9sZRgFIAEoCzI/LmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFjY291bnRWMlJlcXVlc3QuT3JnYW5pemF0aW9uUm9sZVZhbHVlUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxI7CgpmaXJzdF9uYW1lGAcgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUglmaXJzdE5hbWUSOQoJbGFzdF9uYW1lGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUghsYXN0TmFtZRI4CghsYW5ndWFnZRgJIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIIbGFuZ3VhZ2USOAoJbGFzdF9zZWVuGAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWVSCGxhc3RTZWVuElEKBmF2YXRhchgLIAEoCzI5LmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFjY291bnRWMlJlcXVlc3QuQWNjb3VudFYyQXZhdGFyUgZhdmF0YXISoAEKCGRpc2FibGVkGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUJokkFlKghkaXNhYmxlZDJZaWYgZGlzYWJsZWQgaXMgdHJ1ZSwgdGhlIGFjY291bnQgd2lsbCBiZSBkaXNhYmxlZC4gSWYgZmFsc2UsIHRoZSBhY2NvdW50IHdpbGwgYmUgZW5hYmxlZC5SCGRpc2FibGVkEooBCgdkZWxldGVkGA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUJUkkFRKgdkZWxldGVkMkZpZiB0cnVlLCB0aGUgYWNjb3VudCB3aWxsIGJlIGRlbGV0ZWQgYW5kIG90aGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQuUgdkZWxldGVkIlEKF1VwZGF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiVAoTR2V0QWNjb3VudFYyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZCJOChRHZXRBY2NvdW50VjJSZXNwb25zZRI2CgdhY2NvdW50GAEgASgLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUgdhY2NvdW50ImEKIkdldEFjY291bnRWMkJ5RW52aXJvbm1lbnRJRFJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkIl0KI0dldEFjY291bnRWMkJ5RW52aXJvbm1lbnRJRFJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiNwoMR2V0TWVSZXF1ZXN0EicKD29yZ2FuaXphdGlvbl9pZBgBIAEoCVIOb3JnYW5pemF0aW9uSWQiTAoNR2V0TWVSZXNwb25zZRI7CgdhY2NvdW50GAEgASgLMiEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnRSB2FjY291bnQi2gQKFUxpc3RBY2NvdW50c1YyUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEicKD29yZ2FuaXphdGlvbl9pZBgDIAEoCVIOb3JnYW5pemF0aW9uSWQSSwoIb3JkZXJfYnkYBCABKA4yMC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJgCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNy5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSSAoRb3JnYW5pemF0aW9uX3JvbGUYCCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIQb3JnYW5pemF0aW9uUm9sZRJDCg5lbnZpcm9ubWVudF9pZBgJIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVINZW52aXJvbm1lbnRJZBJGChBlbnZpcm9ubWVudF9yb2xlGAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSD2Vudmlyb25tZW50Um9sZSKLAQoWTGlzdEFjY291bnRzVjJSZXNwb25zZRI4CghhY2NvdW50cxgBIAMoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIIYWNjb3VudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQy6zcKB0dhdGV3YXkS9AIKDkdldEV2YWx1YXRpb25zEiguYnVja2V0ZWVyLmdhdGV3YXkuR2V0RXZhbHVhdGlvbnNSZXF1ZXN0GikuYnVja2V0ZWVyLmdhdGV3YXkuR2V0RXZhbHVhdGlvbnNSZXNwb25zZSKMApJB7QEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSD0dldCBFdmFsdWF0aW9ucxphR2V0cyBhbGwgdGhlIGV2YWx1YXRpb25zIGZvciBhIHNwZWNpZmljIHVzZXIuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYENMSUVOVGAgQVBJIEtleSByb2xlLiobYXBpLmdhdGV3YXkuZ2V0X2V2YWx1YXRpb25zckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhUiEC9nZXRfZXZhbHVhdGlvbnM6ASoS7gIKDUdldEV2YWx1YXRpb24SJy5idWNrZXRlZXIuZ2F0ZXdheS5HZXRFdmFsdWF0aW9uUmVxdWVzdBooLmJ1Y2tldGVlci5nYXRld2F5LkdldEV2YWx1YXRpb25SZXNwb25zZSKJApJB6wEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSDkdldCBFdmFsdWF0aW9uGmFHZXRzIGEgc2luZ2xlIGV2YWx1YXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlci4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgQ0xJRU5UYCBBUEkgS2V5IHJvbGUuKhphcGkuZ2F0ZXdheS5nZXRfZXZhbHVhdGlvbnJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIUIg8vZ2V0X2V2YWx1YXRpb246ASoS+gIKD0dldEZlYXR1cmVGbGFncxIpLmJ1Y2tldGVlci5nYXRld2F5LkdldEZlYXR1cmVGbGFnc1JlcXVlc3QaKi5idWNrZXRlZXIuZ2F0ZXdheS5HZXRGZWF0dXJlRmxhZ3NSZXNwb25zZSKPApJB7gEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSEUdldCBGZWF0dXJlIEZsYWdzGl5HZXRzIGFsbCB0aGUgZmVhdHVyZSBmbGFnIGluIGFuIGVudmlyb25tZW50LiBUbyBjYWxsIHRoaXMgQVBJLCBpdCBuZWVkcyBgU0VSVkVSYCBBUEkgS2V5IHJvbGUuKh1hcGkuZ2F0ZXdheS5nZXRfZmVhdHVyZV9mbGFnc3JCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIXIhIvZ2V0X2ZlYXR1cmVfZmxhZ3M6ASoS+wIKD0dldFNlZ21lbnRVc2VycxIpLmJ1Y2tldGVlci5nYXRld2F5LkdldFNlZ21lbnRVc2Vyc1JlcXVlc3QaKi5idWNrZXRlZXIuZ2F0ZXdheS5HZXRTZWdtZW50VXNlcnNSZXNwb25zZSKQApJB7wEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSEUdldCBTZWdtZW50IFVzZXJzGl9HZXRzIGFsbCB0aGUgc2VnbWVudCB1c2VycyBpbiBhbiBlbnZpcm9ubWVudC4gVG8gY2FsbCB0aGlzIEFQSSwgaXQgbmVlZHMgYFNFUlZFUmAgQVBJIEtleSByb2xlLiodYXBpLmdhdGV3YXkuZ2V0X3NlZ21lbnRfdXNlcnNyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCFyISL2dldF9zZWdtZW50X3VzZXJzOgEqEvkCCg5SZWdpc3RlckV2ZW50cxIoLmJ1Y2tldGVlci5nYXRld2F5LlJlZ2lzdGVyRXZlbnRzUmVxdWVzdBopLmJ1Y2tldGVlci5nYXRld2F5LlJlZ2lzdGVyRXZlbnRzUmVzcG9uc2UikQKSQfIBChZDbGllbnQgYW5kIFNlcnZlciBTREtzEg9SZWdpc3RlciBFdmVudHMaZlRoaXMgQVBJIGlzIGZvciByZXBvcnRpbmcgR29hbCBldmVudHMuIFRvIGNhbGwgdGhpcyBBUEksIGl0IG5lZWRzIGEgYENMSUVOVGAgb3IgYFNFUlZFUmAgQVBJIEtleSByb2xlLiobYXBpLmdhdGV3YXkucmVnaXN0ZXJfZXZlbnRzckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhUiEC9yZWdpc3Rlcl9ldmVudHM6ASoSjwIKBVRyYWNrEh8uYnVja2V0ZWVyLmdhdGV3YXkuVHJhY2tSZXF1ZXN0GiAuYnVja2V0ZWVyLmdhdGV3YXkuVHJhY2tSZXNwb25zZSLCAZJBsAEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSBVRyYWNrGnxUaGlzIEFQSSBpcyBhbiBpbnRlZ3JhdGlvbiBmb3IgR29vZ2xlIFRhYiBNYW5hZ2VyIHRvIHJlcG9ydCBHb2FsIGV2ZW50cy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgQ0xJRU5UYCBBUEkgS2V5IHJvbGUuKhFhcGkuZ2F0ZXdheS50cmFja4LT5JMCCBIGL3RyYWNrEtUCCg1DcmVhdGVGZWF0dXJlEicuYnVja2V0ZWVyLmdhdGV3YXkuQ3JlYXRlRmVhdHVyZVJlcXVlc3QaKC5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVGZWF0dXJlUmVzcG9uc2Ui8AGSQdUBCg1GZWF0dXJlIEZsYWdzEgZDcmVhdGUaWENyZWF0ZSBhIG5ldyBGZWF0dXJlIEZsYWcuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHmFwaS5nYXRld2F5LnYxLmZlYXR1cmVzLmNyZWF0ZXJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIRIgwvdjEvZmVhdHVyZXM6ASoStQIKCkdldEZlYXR1cmUSJC5idWNrZXRlZXIuZ2F0ZXdheS5HZXRGZWF0dXJlUmVxdWVzdBolLmJ1Y2tldGVlci5nYXRld2F5LkdldEZlYXR1cmVSZXNwb25zZSLZAZJBvAEKDUZlYXR1cmUgRmxhZ3MSA0dldBpFR2V0IGEgRmVhdHVyZSBGbGFnLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhthcGkuZ2F0ZXdheS52MS5mZWF0dXJlcy5nZXRyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCExIRL3YxL2ZlYXR1cmVzL3tpZH0SuAIKDExpc3RGZWF0dXJlcxImLmJ1Y2tldGVlci5nYXRld2F5Lkxpc3RGZWF0dXJlc1JlcXVlc3QaJy5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0RmVhdHVyZXNSZXNwb25zZSLWAZJBvgEKDUZlYXR1cmUgRmxhZ3MSBExpc3QaRUxpc3QgRmVhdHVyZSBGbGFncy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLiocYXBpLmdhdGV3YXkudjEuZmVhdHVyZXMubGlzdHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIOEgwvdjEvZmVhdHVyZXMS1gIKDVVwZGF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZ2F0ZXdheS5VcGRhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5nYXRld2F5LlVwZGF0ZUZlYXR1cmVSZXNwb25zZSLxAZJB0QEKDUZlYXR1cmUgRmxhZ3MSBlVwZGF0ZRpUVXBkYXRlIGEgRmVhdHVyZSBGbGFnLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgb3IgYEFETUlOYCBBUEkgS2V5IHJvbGUuKh5hcGkuZ2F0ZXdheS52MS5mZWF0dXJlcy51cGRhdGVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCFjIRL3YxL2ZlYXR1cmVzL3tpZH06ASoS7gEKBFBpbmcSHi5idWNrZXRlZXIuZ2F0ZXdheS5QaW5nUmVxdWVzdBofLmJ1Y2tldGVlci5nYXRld2F5LlBpbmdSZXNwb25zZSKkAZJBkwEKB1V0aWxpdHkSBFBpbmcaKlBpbmcgdGhlIHNlcnZlciB0byBjaGVjayBpdHMgYXZhaWxhYmlsaXR5LioQYXBpLmdhdGV3YXkucGluZ2IAckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAgcSBS9waW5nEqACCgpMaXN0UHVzaGVzEiQuYnVja2V0ZWVyLmdhdGV3YXkuTGlzdFB1c2hlc1JlcXVlc3QaJS5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0UHVzaGVzUmVzcG9uc2UixAGSQa4BCgZQdXNoZXMSBExpc3QaPkxpc3QgcHVzaGVzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhphcGkuZ2F0ZXdheS52MS5wdXNoZXMubGlzdHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIMEgovdjEvcHVzaGVzEvMCCgpDcmVhdGVQdXNoEiQuYnVja2V0ZWVyLmdhdGV3YXkuQ3JlYXRlUHVzaFJlcXVlc3QaJS5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVQdXNoUmVzcG9uc2UilwKSQYACCgZQdXNoZXMSBkNyZWF0ZRqLAUNyZWF0ZSBhIG5ldyBQdXNoIG5vdGlmaWNhdGlvbiB0aHJvdWdoIEdvb2dsZSBGaXJlYmFzZSBDbG91ZCBNZXNzYWdpbmcgKEZDTSkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHGFwaS5nYXRld2F5LnYxLnB1c2hlcy5jcmVhdGVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCDSIIL3YxL3B1c2g6ASoSpAIKB0dldFB1c2gSIS5idWNrZXRlZXIuZ2F0ZXdheS5HZXRQdXNoUmVxdWVzdBoiLmJ1Y2tldGVlci5nYXRld2F5LkdldFB1c2hSZXNwb25zZSLRAZJBuAEKBlB1c2hlcxIDR2V0GkpHZXQgYSBQdXNoIG5vdGlmaWNhdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLioZYXBpLmdhdGV3YXkudjEucHVzaGVzLmdldHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIPEg0vdjEvcHVzaC97aWR9EsACCgpVcGRhdGVQdXNoEiQuYnVja2V0ZWVyLmdhdGV3YXkuVXBkYXRlUHVzaFJlcXVlc3QaJS5idWNrZXRlZXIuZ2F0ZXdheS5VcGRhdGVQdXNoUmVzcG9uc2Ui5AGSQcgBCgZQdXNoZXMSBlVwZGF0ZRpUVXBkYXRlIGEgUHVzaCBub3RpZmljYXRpb24uIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBhIGBXUklURWAgb3IgYEFETUlOYCBBUEkgS2V5IHJvbGUuKhxhcGkuZ2F0ZXdheS52MS5wdXNoZXMudXBkYXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhIyDS92MS9wdXNoL3tpZH06ASoSzgIKD0NyZWF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5nYXRld2F5LkNyZWF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVBY2NvdW50VjJSZXNwb25zZSLjAZJByQEKB0FjY291bnQSBkNyZWF0ZRpTQ3JlYXRlIGEgbmV3IEFjY291bnQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHWFwaS5nYXRld2F5LnYxLmFjY291bnQuY3JlYXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhAiCy92MS9hY2NvdW50OgEqEuUCCg9VcGRhdGVBY2NvdW50VjISKS5idWNrZXRlZXIuZ2F0ZXdheS5VcGRhdGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmdhdGV3YXkuVXBkYXRlQWNjb3VudFYyUmVzcG9uc2Ui+gGSQcYBCgdBY2NvdW50EgZVcGRhdGUaUFVwZGF0ZSBhbiBBY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgb3IgYEFETUlOYCBBUEkgS2V5IHJvbGUuKh1hcGkuZ2F0ZXdheS52MS5hY2NvdW50LnVwZGF0ZXJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIqMiUvdjEvYWNjb3VudC97b3JnYW5pemF0aW9uX2lkfS97ZW1haWx9OgEqEtcCCgxHZXRBY2NvdW50VjISJi5idWNrZXRlZXIuZ2F0ZXdheS5HZXRBY2NvdW50VjJSZXF1ZXN0GicuYnVja2V0ZWVyLmdhdGV3YXkuR2V0QWNjb3VudFYyUmVzcG9uc2Ui9QGSQcQBCgdBY2NvdW50EhZHZXQgYnkgT3JnYW5pemF0aW9uIElEGkFHZXQgYW4gQWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLioaYXBpLmdhdGV3YXkudjEuYWNjb3VudC5nZXRyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCJxIlL3YxL2FjY291bnQve29yZ2FuaXphdGlvbl9pZH0ve2VtYWlsfRLBAwobR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEEjUuYnVja2V0ZWVyLmdhdGV3YXkuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVxdWVzdBo2LmJ1Y2tldGVlci5nYXRld2F5LkdldEFjY291bnRWMkJ5RW52aXJvbm1lbnRJRFJlc3BvbnNlIrICkkHnAQoHQWNjb3VudBIVR2V0IGJ5IEVudmlyb25tZW50IElEGlNHZXQgYW4gQWNjb3VudCBieSBFbnZpcm9ubWVudCBJRC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLiosYXBpLmdhdGV3YXkudjEuYWNjb3VudC5nZXRfYnlfZW52aXJvbm1lbnRfaWRyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCQRI/L3YxL2FjY291bnQvZ2V0LWFjY291bnQtYnktZW52aXJvbm1lbnQve2Vudmlyb25tZW50X2lkfS97ZW1haWx9EsYCCgVHZXRNZRIfLmJ1Y2tldGVlci5nYXRld2F5LkdldE1lUmVxdWVzdBogLmJ1Y2tldGVlci5nYXRld2F5LkdldE1lUmVzcG9uc2Ui+QGSQc0BCgdBY2NvdW50EhNHZXQgU2VydmljZSBBY2NvdW50GkpHZXQgdGhlIGN1cnJlbnQgQWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLiodYXBpLmdhdGV3YXkudjEuYWNjb3VudC5nZXRfbWVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCIhIgL3YxL2FjY291bnQvbWUve29yZ2FuaXphdGlvbl9pZH0StgIKDkxpc3RBY2NvdW50c1YyEiguYnVja2V0ZWVyLmdhdGV3YXkuTGlzdEFjY291bnRzVjJSZXF1ZXN0GikuYnVja2V0ZWVyLmdhdGV3YXkuTGlzdEFjY291bnRzVjJSZXNwb25zZSLOAZJBtgEKB0FjY291bnQSBExpc3QaREdldCBsaXN0IEFjY291bnRzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhthcGkuZ2F0ZXdheS52MS5hY2NvdW50Lmxpc3RyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCDhIML3YxL2FjY291bnRzQoQGWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZ2F0ZXdheZJBzwUSIAoZQnVja2V0ZWVyIEdhdGV3YXkgU2VydmljZTIDMS4wGghFTkRQT0lOVCoBAjIQYXBwbGljYXRpb24vanNvbjoQYXBwbGljYXRpb24vanNvblK0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfVKyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1SqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9WlAKTgoKQXBpS2V5QXV0aBJACAISK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4aDWF1dGhvcml6YXRpb24gAmIQCg4KCkFwaUtleUF1dGgSAGIGcHJvdG8z"
+ descriptor: CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCuIFChxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvEg9nb29nbGUucHJvdG9idWYimAEKBlN0cnVjdBI7CgZmaWVsZHMYASADKAsyIy5nb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5UgZmaWVsZHMaUQoLRmllbGRzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASKyAgoFVmFsdWUSOwoKbnVsbF92YWx1ZRgBIAEoDjIaLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAFIJbnVsbFZhbHVlEiMKDG51bWJlcl92YWx1ZRgCIAEoAUgAUgtudW1iZXJWYWx1ZRIjCgxzdHJpbmdfdmFsdWUYAyABKAlIAFILc3RyaW5nVmFsdWUSHwoKYm9vbF92YWx1ZRgEIAEoCEgAUglib29sVmFsdWUSPAoMc3RydWN0X3ZhbHVlGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAUgtzdHJ1Y3RWYWx1ZRI7CgpsaXN0X3ZhbHVlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZUgAUglsaXN0VmFsdWVCBgoEa2luZCI7CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YWx1ZXMqGwoJTnVsbFZhbHVlEg4KCk5VTExfVkFMVUUQAEJ/ChNjb20uZ29vZ2xlLnByb3RvYnVmQgtTdHJ1Y3RQcm90b1ABWi9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zdHJ1Y3RwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqY+Cixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iswgKB1N3YWdnZXISGAoHc3dhZ2dlchgBIAEoCVIHc3dhZ2dlchJDCgRpbmZvGAIgASgLMi8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mb1IEaW5mbxISCgRob3N0GAMgASgJUgRob3N0EhsKCWJhc2VfcGF0aBgEIAEoCVIIYmFzZVBhdGgSSwoHc2NoZW1lcxgFIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEl8KCXJlc3BvbnNlcxgKIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJxChRzZWN1cml0eV9kZWZpbml0aW9ucxgLIAEoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnNSE3NlY3VyaXR5RGVmaW5pdGlvbnMSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJCCgR0YWdzGA0gAygLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgR0YWdzEmUKDWV4dGVybmFsX2RvY3MYDiABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJiCgpleHRlbnNpb25zGA8gAygLMkIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJSgQICRAKItYHCglPcGVyYXRpb24SEgoEdGFncxgBIAMoCVIEdGFncxIYCgdzdW1tYXJ5GAIgASgJUgdzdW1tYXJ5EiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAQgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSIQoMb3BlcmF0aW9uX2lkGAUgASgJUgtvcGVyYXRpb25JZBIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEmEKCXJlc3BvbnNlcxgJIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEksKB3NjaGVtZXMYCiADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSHgoKZGVwcmVjYXRlZBgLIAEoCFIKZGVwcmVjYXRlZBJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EmQKCmV4dGVuc2lvbnMYDSADKAsyRC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zElUKCnBhcmFtZXRlcnMYDiABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5QYXJhbWV0ZXJzUgpwYXJhbWV0ZXJzGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCSJiCgpQYXJhbWV0ZXJzElQKB2hlYWRlcnMYASADKAsyOi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXJSB2hlYWRlcnMiowIKD0hlYWRlclBhcmFtZXRlchISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJTCgR0eXBlGAMgASgOMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyLlR5cGVSBHR5cGUSFgoGZm9ybWF0GAQgASgJUgZmb3JtYXQSGgoIcmVxdWlyZWQYBSABKAhSCHJlcXVpcmVkIkUKBFR5cGUSCwoHVU5LTk9XThAAEgoKBlNUUklORxABEgoKBk5VTUJFUhACEgsKB0lOVEVHRVIQAxILCgdCT09MRUFOEARKBAgGEAdKBAgHEAgi2AEKBkhlYWRlchIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEgoEdHlwZRgCIAEoCVIEdHlwZRIWCgZmb3JtYXQYAyABKAlSBmZvcm1hdBIYCgdkZWZhdWx0GAYgASgJUgdkZWZhdWx0EhgKB3BhdHRlcm4YDSABKAlSB3BhdHRlcm5KBAgEEAVKBAgFEAZKBAgHEAhKBAgIEAlKBAgJEApKBAgKEAtKBAgLEAxKBAgMEA1KBAgOEA9KBAgPEBBKBAgQEBFKBAgREBJKBAgSEBMimgUKCFJlc3BvbnNlEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhJJCgZzY2hlbWEYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSBnNjaGVtYRJaCgdoZWFkZXJzGAMgAygLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEl0KCGV4YW1wbGVzGAQgAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXhhbXBsZXNFbnRyeVIIZXhhbXBsZXMSYwoKZXh0ZW5zaW9ucxgFIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxptCgxIZWFkZXJzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSRwoFdmFsdWUYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJSBXZhbHVlOgI4ARo7Cg1FeGFtcGxlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi1gMKBEluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIoChB0ZXJtc19vZl9zZXJ2aWNlGAMgASgJUg50ZXJtc09mU2VydmljZRJMCgdjb250YWN0GAQgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuQ29udGFjdFIHY29udGFjdBJMCgdsaWNlbnNlGAUgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuTGljZW5zZVIHbGljZW5zZRIYCgd2ZXJzaW9uGAYgASgJUgd2ZXJzaW9uEl8KCmV4dGVuc2lvbnMYByADKAsyPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJFCgdDb250YWN0EhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwSFAoFZW1haWwYAyABKAlSBWVtYWlsIi8KB0xpY2Vuc2USEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybCJLChVFeHRlcm5hbERvY3VtZW50YXRpb24SIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhAKA3VybBgCIAEoCVIDdXJsIqoCCgZTY2hlbWESVgoLanNvbl9zY2hlbWEYASABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUgpqc29uU2NoZW1hEiQKDWRpc2NyaW1pbmF0b3IYAiABKAlSDWRpc2NyaW1pbmF0b3ISGwoJcmVhZF9vbmx5GAMgASgIUghyZWFkT25seRJlCg1leHRlcm5hbF9kb2NzGAUgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSGAoHZXhhbXBsZRgGIAEoCVIHZXhhbXBsZUoECAQQBSLXCgoKSlNPTlNjaGVtYRIQCgNyZWYYAyABKAlSA3JlZhIUCgV0aXRsZRgFIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlZmF1bHQYByABKAlSB2RlZmF1bHQSGwoJcmVhZF9vbmx5GAggASgIUghyZWFkT25seRIYCgdleGFtcGxlGAkgASgJUgdleGFtcGxlEh8KC211bHRpcGxlX29mGAogASgBUgptdWx0aXBsZU9mEhgKB21heGltdW0YCyABKAFSB21heGltdW0SKwoRZXhjbHVzaXZlX21heGltdW0YDCABKAhSEGV4Y2x1c2l2ZU1heGltdW0SGAoHbWluaW11bRgNIAEoAVIHbWluaW11bRIrChFleGNsdXNpdmVfbWluaW11bRgOIAEoCFIQZXhjbHVzaXZlTWluaW11bRIdCgptYXhfbGVuZ3RoGA8gASgEUgltYXhMZW5ndGgSHQoKbWluX2xlbmd0aBgQIAEoBFIJbWluTGVuZ3RoEhgKB3BhdHRlcm4YESABKAlSB3BhdHRlcm4SGwoJbWF4X2l0ZW1zGBQgASgEUghtYXhJdGVtcxIbCgltaW5faXRlbXMYFSABKARSCG1pbkl0ZW1zEiEKDHVuaXF1ZV9pdGVtcxgWIAEoCFILdW5pcXVlSXRlbXMSJQoObWF4X3Byb3BlcnRpZXMYGCABKARSDW1heFByb3BlcnRpZXMSJQoObWluX3Byb3BlcnRpZXMYGSABKARSDW1pblByb3BlcnRpZXMSGgoIcmVxdWlyZWQYGiADKAlSCHJlcXVpcmVkEhQKBWFycmF5GCIgAygJUgVhcnJheRJfCgR0eXBlGCMgAygOMksuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5KU09OU2NoZW1hU2ltcGxlVHlwZXNSBHR5cGUSFgoGZm9ybWF0GCQgASgJUgZmb3JtYXQSEgoEZW51bRguIAMoCVIEZW51bRJ6ChNmaWVsZF9jb25maWd1cmF0aW9uGOkHIAEoCzJILmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRmllbGRDb25maWd1cmF0aW9uUhJmaWVsZENvbmZpZ3VyYXRpb24SZQoKZXh0ZW5zaW9ucxgwIAMoCzJFLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGjwKEkZpZWxkQ29uZmlndXJhdGlvbhImCg9wYXRoX3BhcmFtX25hbWUYLyABKAlSDXBhdGhQYXJhbU5hbWUaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEidwoVSlNPTlNjaGVtYVNpbXBsZVR5cGVzEgsKB1VOS05PV04QABIJCgVBUlJBWRABEgsKB0JPT0xFQU4QAhILCgdJTlRFR0VSEAMSCAoETlVMTBAEEgoKBk5VTUJFUhAFEgoKBk9CSkVDVBAGEgoKBlNUUklORxAHSgQIARACSgQIAhADSgQIBBAFSgQIEhATSgQIExAUSgQIFxAYSgQIGxAcSgQIHBAdSgQIHRAeSgQIHhAiSgQIJRAqSgQIKhArSgQIKxAuItkCCgNUYWcSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgDIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEl4KCmV4dGVuc2lvbnMYBCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWcuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIvcBChNTZWN1cml0eURlZmluaXRpb25zEmgKCHNlY3VyaXR5GAEgAygLMkwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9ucy5TZWN1cml0eUVudHJ5UghzZWN1cml0eRp2Cg1TZWN1cml0eUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ek8KBXZhbHVlGAIgASgLMjkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWVSBXZhbHVlOgI4ASL/BgoOU2VjdXJpdHlTY2hlbWUSUgoEdHlwZRgBIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLlR5cGVSBHR5cGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhIKBG5hbWUYAyABKAlSBG5hbWUSTAoCaW4YBCABKA4yPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5JblICaW4SUgoEZmxvdxgFIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkZsb3dSBGZsb3cSKwoRYXV0aG9yaXphdGlvbl91cmwYBiABKAlSEGF1dGhvcml6YXRpb25VcmwSGwoJdG9rZW5fdXJsGAcgASgJUgh0b2tlblVybBJJCgZzY29wZXMYCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXNSBnNjb3BlcxJpCgpleHRlbnNpb25zGAkgAygLMkkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIksKBFR5cGUSEAoMVFlQRV9JTlZBTElEEAASDgoKVFlQRV9CQVNJQxABEhAKDFRZUEVfQVBJX0tFWRACEg8KC1RZUEVfT0FVVEgyEAMiMQoCSW4SDgoKSU5fSU5WQUxJRBAAEgwKCElOX1FVRVJZEAESDQoJSU5fSEVBREVSEAIiagoERmxvdxIQCgxGTE9XX0lOVkFMSUQQABIRCg1GTE9XX0lNUExJQ0lUEAESEQoNRkxPV19QQVNTV09SRBACEhQKEEZMT1dfQVBQTElDQVRJT04QAxIUChBGTE9XX0FDQ0VTU19DT0RFEAQi9gIKE1NlY3VyaXR5UmVxdWlyZW1lbnQSigEKFHNlY3VyaXR5X3JlcXVpcmVtZW50GAEgAygLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50RW50cnlSE3NlY3VyaXR5UmVxdWlyZW1lbnQaMAoYU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlEhQKBXNjb3BlGAEgAygJUgVzY29wZRqfAQoYU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Em0KBXZhbHVlGAIgASgLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50VmFsdWVSBXZhbHVlOgI4ASKWAQoGU2NvcGVzElIKBXNjb3BlGAEgAygLMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzLlNjb3BlRW50cnlSBXNjb3BlGjgKClNjb3BlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASo7CgZTY2hlbWUSCwoHVU5LTk9XThAAEggKBEhUVFAQARIJCgVIVFRQUxACEgYKAldTEAMSBwoDV1NTEARCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCv0GCi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvOn4KEW9wZW5hcGl2Ml9zd2FnZ2VyEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJIIIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXJSEG9wZW5hcGl2MlN3YWdnZXI6hgEKE29wZW5hcGl2Ml9vcGVyYXRpb24SHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiSCCABKAsyNC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb25SEm9wZW5hcGl2Mk9wZXJhdGlvbjp+ChBvcGVuYXBpdjJfc2NoZW1hEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJIIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIPb3BlbmFwaXYyU2NoZW1hOnUKDW9wZW5hcGl2Ml90YWcSHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMYkgggASgLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgxvcGVuYXBpdjJUYWc6fgoPb3BlbmFwaXYyX2ZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiSCCABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUg5vcGVuYXBpdjJGaWVsZEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMKwAQKFXByb3RvL3VzZXIvdXNlci5wcm90bxIOYnVja2V0ZWVyLnVzZXIi3gMKBFVzZXISDgoCaWQYASABKAlSAmlkEjIKBGRhdGEYAiADKAsyHi5idWNrZXRlZXIudXNlci5Vc2VyLkRhdGFFbnRyeVIEZGF0YRJFCgt0YWdnZWRfZGF0YRgDIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuVGFnZ2VkRGF0YUVudHJ5Ugp0YWdnZWREYXRhEhsKCWxhc3Rfc2VlbhgEIAEoA1IIbGFzdFNlZW4SHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0GnwKBERhdGESOgoFdmFsdWUYASADKAsyJC5idWNrZXRlZXIudXNlci5Vc2VyLkRhdGEuVmFsdWVFbnRyeVIFdmFsdWUaOAoKVmFsdWVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGjcKCURhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlgKD1RhZ2dlZERhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YVIFdmFsdWU6AjgBQi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by91c2VyYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCp4CChpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUisQEKBlJlYXNvbhIyCgR0eXBlGAEgASgOMh4uYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uLlR5cGVSBHR5cGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIloKBFR5cGUSCgoGVEFSR0VUEAASCAoEUlVMRRABEgsKB0RFRkFVTFQQAxIKCgZDTElFTlQQBBIRCg1PRkZfVkFSSUFUSU9OEAUSEAoMUFJFUkVRVUlTSVRFEAZCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqYBgoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aGnByb3RvL2ZlYXR1cmUvcmVhc29uLnByb3RvIuMCCgpFdmFsdWF0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIXCgd1c2VyX2lkGAQgASgJUgZ1c2VySWQSIQoMdmFyaWF0aW9uX2lkGAUgASgJUgt2YXJpYXRpb25JZBI+Cgl2YXJpYXRpb24YBiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25CAhgBUgl2YXJpYXRpb24SMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SJwoPdmFyaWF0aW9uX3ZhbHVlGAggASgJUg52YXJpYXRpb25WYWx1ZRIlCg52YXJpYXRpb25fbmFtZRgJIAEoCVINdmFyaWF0aW9uTmFtZSKGAgoPVXNlckV2YWx1YXRpb25zEhIKAmlkGAEgASgJQgIYAVICaWQSPwoLZXZhbHVhdGlvbnMYAiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgtldmFsdWF0aW9ucxIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSMAoUYXJjaGl2ZWRfZmVhdHVyZV9pZHMYBCADKAlSEmFyY2hpdmVkRmVhdHVyZUlkcxIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIioKBVN0YXRlEgoKBlFVRVVFRBAAEgsKB1BBUlRJQUwQARIICgRGVUxMEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrHAwoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlItoCCgZDbGF1c2USDgoCaWQYASABKAlSAmlkEhwKCWF0dHJpYnV0ZRgCIAEoCVIJYXR0cmlidXRlEj4KCG9wZXJhdG9yGAMgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchIWCgZ2YWx1ZXMYBCADKAlSBnZhbHVlcyLJAQoIT3BlcmF0b3ISCgoGRVFVQUxTEAASBgoCSU4QARINCglFTkRTX1dJVEgQAhIPCgtTVEFSVFNfV0lUSBADEgsKB1NFR01FTlQQBBILCgdHUkVBVEVSEAUSFAoQR1JFQVRFUl9PUl9FUVVBTBAGEggKBExFU1MQBxIRCg1MRVNTX09SX0VRVUFMEAgSCgoGQkVGT1JFEAkSCQoFQUZURVIQChIQCgxGRUFUVVJFX0ZMQUcQCxITCg9QQVJUSUFMTFlfTUFUQ0gQDEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrsEChxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSItCg1GaXhlZFN0cmF0ZWd5EhwKCXZhcmlhdGlvbhgBIAEoCVIJdmFyaWF0aW9uIqIBCg9Sb2xsb3V0U3RyYXRlZ3kSTAoKdmFyaWF0aW9ucxgBIAMoCzIsLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneS5WYXJpYXRpb25SCnZhcmlhdGlvbnMaQQoJVmFyaWF0aW9uEhwKCXZhcmlhdGlvbhgBIAEoCVIJdmFyaWF0aW9uEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0IvgBCghTdHJhdGVneRI0CgR0eXBlGAEgASgOMiAuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3kuVHlwZVIEdHlwZRJHCg5maXhlZF9zdHJhdGVneRgCIAEoCzIgLmJ1Y2tldGVlci5mZWF0dXJlLkZpeGVkU3RyYXRlZ3lSDWZpeGVkU3RyYXRlZ3kSTQoQcm9sbG91dF9zdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIPcm9sbG91dFN0cmF0ZWd5Ih4KBFR5cGUSCQoFRklYRUQQABILCgdST0xMT1VUEAFCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqpAgoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aHHByb3RvL2ZlYXR1cmUvc3RyYXRlZ3kucHJvdG8ihAEKBFJ1bGUSDgoCaWQYASABKAlSAmlkEjcKCHN0cmF0ZWd5GAIgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSCHN0cmF0ZWd5EjMKB2NsYXVzZXMYAyADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2VSB2NsYXVzZXNCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqoAQoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIjwKBlRhcmdldBIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIUCgV1c2VycxgCIAMoCVIFdXNlcnNCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwr0AgoqcHJvdG8vZmVhdHVyZS9mZWF0dXJlX2xhc3RfdXNlZF9pbmZvLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSL3AQoTRmVhdHVyZUxhc3RVc2VkSW5mbxIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGAoHdmVyc2lvbhgCIAEoBVIHdmVyc2lvbhIgCgxsYXN0X3VzZWRfYXQYAyABKANSCmxhc3RVc2VkQXQSHQoKY3JlYXRlZF9hdBgEIAEoA1IJY3JlYXRlZEF0EjIKFWNsaWVudF9vbGRlc3RfdmVyc2lvbhgFIAEoCVITY2xpZW50T2xkZXN0VmVyc2lvbhIyChVjbGllbnRfbGF0ZXN0X3ZlcnNpb24YBiABKAlSE2NsaWVudExhdGVzdFZlcnNpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrCAQogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIlAKDFByZXJlcXVpc2l0ZRIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrMMChtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlGhhwcm90by9mZWF0dXJlL3J1bGUucHJvdG8aGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxoqcHJvdG8vZmVhdHVyZS9mZWF0dXJlX2xhc3RfdXNlZF9pbmZvLnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90byLSBwoHRmVhdHVyZRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGAoHZW5hYmxlZBgEIAEoCFIHZW5hYmxlZBIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkEjkKFmV2YWx1YXRpb25fdW5kZWxheWFibGUYBiABKAhCAhgBUhVldmFsdWF0aW9uVW5kZWxheWFibGUSEAoDdHRsGAcgASgFUgN0dGwSGAoHdmVyc2lvbhgIIAEoBVIHdmVyc2lvbhIdCgpjcmVhdGVkX2F0GAkgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgKIAEoA1IJdXBkYXRlZEF0EjwKCnZhcmlhdGlvbnMYCyADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSMwoHdGFyZ2V0cxgMIAMoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlRhcmdldFIHdGFyZ2V0cxItCgVydWxlcxgNIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEkYKEGRlZmF1bHRfc3RyYXRlZ3kYDiABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIPZGVmYXVsdFN0cmF0ZWd5EiMKDW9mZl92YXJpYXRpb24YDyABKAlSDG9mZlZhcmlhdGlvbhISCgR0YWdzGBAgAygJUgR0YWdzEkwKDmxhc3RfdXNlZF9pbmZvGBEgASgLMiYuYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZUxhc3RVc2VkSW5mb1IMbGFzdFVzZWRJbmZvEh4KCm1haW50YWluZXIYEiABKAlSCm1haW50YWluZXISTwoOdmFyaWF0aW9uX3R5cGUYEyABKA4yKC5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlLlZhcmlhdGlvblR5cGVSDXZhcmlhdGlvblR5cGUSGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkEkUKDXByZXJlcXVpc2l0ZXMYFSADKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDXByZXJlcXVpc2l0ZXMSIwoNc2FtcGxpbmdfc2VlZBgWIAEoCVIMc2FtcGxpbmdTZWVkIj4KDVZhcmlhdGlvblR5cGUSCgoGU1RSSU5HEAASCwoHQk9PTEVBThABEgoKBk5VTUJFUhACEggKBEpTT04QAyJSCghGZWF0dXJlcxI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEg4KAmlkGAIgASgJUgJpZCJzChJFbnZpcm9ubWVudEZlYXR1cmUSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSNgoIZmVhdHVyZXMYAiADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcyJnCgNUYWcSDgoCaWQYASABKAlSAmlkEh0KCmNyZWF0ZWRfYXQYAiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAMgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgEIAEoCVIEbmFtZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK5AEKGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI2CgNBbnkSGQoIdHlwZV91cmwYASABKAlSB3R5cGVVcmwSFAoFdmFsdWUYAiABKAxSBXZhbHVlQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKtQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiggEKDFNlZ21lbnRVc2VycxIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSNAoFdXNlcnMYAiADKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlclIFdXNlcnMSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKoAUKIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSKtBAoLRmxhZ1RyaWdnZXISDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI3CgR0eXBlGAQgASgOMiMuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuVHlwZVIEdHlwZRI9CgZhY3Rpb24YBSABKA4yJS5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlci5BY3Rpb25SBmFjdGlvbhIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SIwoNdHJpZ2dlcl9jb3VudBgHIAEoBVIMdHJpZ2dlckNvdW50EioKEWxhc3RfdHJpZ2dlcmVkX2F0GAggASgDUg9sYXN0VHJpZ2dlcmVkQXQSFAoFdG9rZW4YCSABKAlSBXRva2VuEhoKCGRpc2FibGVkGAogASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAsgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgMIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkIioKBFR5cGUSEAoMVHlwZV9VTktOT1dOEAASEAoMVHlwZV9XRUJIT09LEAEiOwoGQWN0aW9uEhIKDkFjdGlvbl9VTktOT1dOEAASDQoJQWN0aW9uX09OEAESDgoKQWN0aW9uX09GRhACSgQIAxAEQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKwCMKG3Byb3RvL2ZlYXR1cmUvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxogcHJvdG8vZmVhdHVyZS9mbGFnX3RyaWdnZXIucHJvdG8iOQoHQ29tbWFuZBIuCgdjb21tYW5kGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIHY29tbWFuZCK1AwoUQ3JlYXRlRmVhdHVyZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSEgoEdGFncxgFIAMoCVIEdGFncxJYChpkZWZhdWx0X29uX3ZhcmlhdGlvbl9pbmRleBgGIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhdkZWZhdWx0T25WYXJpYXRpb25JbmRleBJaChtkZWZhdWx0X29mZl92YXJpYXRpb25faW5kZXgYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIYZGVmYXVsdE9mZlZhcmlhdGlvbkluZGV4Ek8KDnZhcmlhdGlvbl90eXBlGAggASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlIhcKFUFyY2hpdmVGZWF0dXJlQ29tbWFuZCIZChdVbmFyY2hpdmVGZWF0dXJlQ29tbWFuZCIWChREZWxldGVGZWF0dXJlQ29tbWFuZCIqChRSZW5hbWVGZWF0dXJlQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIjwKGENoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24iuAEKKUNoYW5nZUJ1bGtVcGxvYWRTZWdtZW50VXNlcnNTdGF0dXNDb21tYW5kEjkKBnN0YXR1cxgBIAEoDjIhLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnQuU3RhdHVzUgZzdGF0dXMSOgoFc3RhdGUYAiABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUSFAoFY291bnQYAyABKANSBWNvdW50IiEKDUFkZFRhZ0NvbW1hbmQSEAoDdGFnGAEgASgJUgN0YWciJAoQUmVtb3ZlVGFnQ29tbWFuZBIQCgN0YWcYASABKAlSA3RhZyIWChRFbmFibGVGZWF0dXJlQ29tbWFuZCIXChVEaXNhYmxlRmVhdHVyZUNvbW1hbmQiYQoTQWRkVmFyaWF0aW9uQ29tbWFuZBIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24iKAoWUmVtb3ZlVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiQwobQ2hhbmdlVmFyaWF0aW9uVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUiQAoaQ2hhbmdlVmFyaWF0aW9uTmFtZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVQohQ2hhbmdlVmFyaWF0aW9uRGVzY3JpcHRpb25Db21tYW5kEg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iKwoZQ2hhbmdlT2ZmVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiPwoZQWRkVXNlclRvVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSEgoEdXNlchgCIAEoCVIEdXNlciJECh5SZW1vdmVVc2VyRnJvbVZhcmlhdGlvbkNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBHVzZXIYAiABKAlSBHVzZXIiVwocQ2hhbmdlRGVmYXVsdFN0cmF0ZWd5Q29tbWFuZBI3CghzdHJhdGVneRgBIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSI9Cg5BZGRSdWxlQ29tbWFuZBIrCgRydWxlGAEgASgLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIEcnVsZSJ9ChlDaGFuZ2VSdWxlU3RyYXRlZ3lDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSNwoIc3RyYXRlZ3kYAyABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIIc3RyYXRlZ3kiNAoXQ2hhbmdlUnVsZXNPcmRlckNvbW1hbmQSGQoIcnVsZV9pZHMYAiADKAlSB3J1bGVJZHMiIwoRRGVsZXRlUnVsZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkIl4KEEFkZENsYXVzZUNvbW1hbmQSFwoHcnVsZV9pZBgBIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgCIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlIj4KE0RlbGV0ZUNsYXVzZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCJlChxDaGFuZ2VDbGF1c2VBdHRyaWJ1dGVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSHAoJYXR0cmlidXRlGAMgASgJUglhdHRyaWJ1dGUihgEKG0NoYW5nZUNsYXVzZU9wZXJhdG9yQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEj4KCG9wZXJhdG9yGAMgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvciJWChVBZGRDbGF1c2VWYWx1ZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIUCgV2YWx1ZRgDIAEoCVIFdmFsdWUiWQoYUmVtb3ZlQ2xhdXNlVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSFAoFdmFsdWUYAyABKAlSBXZhbHVlIoMBChpDaGFuZ2VGaXhlZFN0cmF0ZWd5Q29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjwKCHN0cmF0ZWd5GAMgASgLMiAuYnVja2V0ZWVyLmZlYXR1cmUuRml4ZWRTdHJhdGVneVIIc3RyYXRlZ3kihwEKHENoYW5nZVJvbGxvdXRTdHJhdGVneUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI+CghzdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIIc3RyYXRlZ3kiTAoUQ3JlYXRlU2VnbWVudENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iFgoURGVsZXRlU2VnbWVudENvbW1hbmQiLgoYQ2hhbmdlU2VnbWVudE5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiQwofQ2hhbmdlU2VnbWVudERlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24ibgoVQWRkU2VnbWVudFVzZXJDb21tYW5kEhkKCHVzZXJfaWRzGAEgAygJUgd1c2VySWRzEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlInEKGERlbGV0ZVNlZ21lbnRVc2VyQ29tbWFuZBIZCgh1c2VyX2lkcxgBIAMoCVIHdXNlcklkcxI6CgVzdGF0ZRgCIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSJvCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzQ29tbWFuZBISCgRkYXRhGAEgASgMUgRkYXRhEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlIiAKHkluY3JlbWVudEZlYXR1cmVWZXJzaW9uQ29tbWFuZCJCChNDbG9uZUZlYXR1cmVDb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhoKGFJlc2V0U2FtcGxpbmdTZWVkQ29tbWFuZCJdChZBZGRQcmVyZXF1aXNpdGVDb21tYW5kEkMKDHByZXJlcXVpc2l0ZRgBIAEoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVIMcHJlcmVxdWlzaXRlIjoKGVJlbW92ZVByZXJlcXVpc2l0ZUNvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkImkKIkNoYW5nZVByZXJlcXVpc2l0ZVZhcmlhdGlvbkNvbW1hbmQSQwoMcHJlcmVxdWlzaXRlGAEgASgLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUgxwcmVyZXF1aXNpdGUi0wEKGENyZWF0ZUZsYWdUcmlnZ2VyQ29tbWFuZBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgCIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAMgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uIhkKF1Jlc2V0RmxhZ1RyaWdnZXJDb21tYW5kIkcKI0NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIaChhFbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQiGwoZRGlzYWJsZUZsYWdUcmlnZ2VyQ29tbWFuZCIaChhEZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQiHwodVXBkYXRlRmxhZ1RyaWdnZXJVc2FnZUNvbW1hbmRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqslwEKG3Byb3RvL2ZlYXR1cmUvc2VydmljZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxobcHJvdG8vZmVhdHVyZS9jb21tYW5kLnByb3RvGhtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoVcHJvdG8vdXNlci91c2VyLnByb3RvGhtwcm90by9mZWF0dXJlL3NlZ21lbnQucHJvdG8aIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8aGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8iUAoRR2V0RmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkoKEkdldEZlYXR1cmVSZXNwb25zZRI0CgdmZWF0dXJlGAEgASgLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIHZmVhdHVyZSJTChJHZXRGZWF0dXJlc1JlcXVlc3QSEAoDaWRzGAIgAygJUgNpZHMSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiTQoTR2V0RmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzIvUFChNMaXN0RmVhdHVyZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISEgoEdGFncxgDIAMoCVIEdGFncxJJCghvcmRlcl9ieRgEIAEoDjIuLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJeCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIeCgptYWludGFpbmVyGAcgASgJUgptYWludGFpbmVyEjQKB2VuYWJsZWQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEkEKDmhhc19leHBlcmltZW50GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaGFzRXhwZXJpbWVudBIlCg5zZWFyY2hfa2V5d29yZBgKIAEoCVINc2VhcmNoS2V5d29yZBI2CghhcmNoaXZlZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEkcKEWhhc19wcmVyZXF1aXNpdGVzGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIQaGFzUHJlcmVxdWlzaXRlcxIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZCJXCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIICgRUQUdTEAQSCwoHRU5BQkxFRBAFIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQAUoECAYQByKHAQoUTGlzdEZlYXR1cmVzUmVzcG9uc2USNgoIZmVhdHVyZXMYASADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAQoaTGlzdEVuYWJsZWRGZWF0dXJlc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchISCgR0YWdzGAMgAygJUgR0YWdzEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIm0KG0xpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yIoYBChRDcmVhdGVGZWF0dXJlUmVxdWVzdBJBCgdjb21tYW5kGAEgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiTQoVQ3JlYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIs8FChRVcGRhdGVGZWF0dXJlUmVxdWVzdBIYCgdjb21tZW50GAEgASgJUgdjb21tZW50EiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkEg4KAmlkGAMgASgJUgJpZBIwCgRuYW1lGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAUgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbhISCgR0YWdzGAYgAygJUgR0YWdzEjQKB2VuYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEjYKCGFyY2hpdmVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSPAoKdmFyaWF0aW9ucxgJIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxJFCg1wcmVyZXF1aXNpdGVzGAogAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEjMKB3RhcmdldHMYCyADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMSLQoFcnVsZXMYDCADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxJGChBkZWZhdWx0X3N0cmF0ZWd5GA0gASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSD2RlZmF1bHRTdHJhdGVneRJBCg1vZmZfdmFyaWF0aW9uGA4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgxvZmZWYXJpYXRpb24iTQoVVXBkYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIrABChRFbmFibGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRW5hYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVEaXNhYmxlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZEaXNhYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVBcmNoaXZlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BcmNoaXZlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZBcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrYBChdVbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGgoYVW5hcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrABChREZWxldGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGVsZXRlRmVhdHVyZVJlc3BvbnNlIt8DChtVcGRhdGVGZWF0dXJlRGV0YWlsc1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEl0KFnJlbmFtZV9mZWF0dXJlX2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuZmVhdHVyZS5SZW5hbWVGZWF0dXJlQ29tbWFuZFIUcmVuYW1lRmVhdHVyZUNvbW1hbmQSaQoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYAyABKAsyKy5idWNrZXRlZXIuZmVhdHVyZS5DaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBJKChBhZGRfdGFnX2NvbW1hbmRzGAQgAygLMiAuYnVja2V0ZWVyLmZlYXR1cmUuQWRkVGFnQ29tbWFuZFIOYWRkVGFnQ29tbWFuZHMSUwoTcmVtb3ZlX3RhZ19jb21tYW5kcxgFIAMoCzIjLmJ1Y2tldGVlci5mZWF0dXJlLlJlbW92ZVRhZ0NvbW1hbmRSEXJlbW92ZVRhZ0NvbW1hbmRzEhgKB2NvbW1lbnQYByABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWRKBAgGEAciHgocVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSKvAQoeVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBI2Cghjb21tYW5kcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkNvbW1hbmRSCGNvbW1hbmRzEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiIQofVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXNwb25zZSKhAgodVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEjYKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZFIIY29tbWFuZHMSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBJJCgRmcm9tGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QuRnJvbVIEZnJvbRIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZCImCgRGcm9tEgsKB1VOS05PV04QABIICgRVU0VSEAESBwoDT1BTEAJKBAgDEAQiIAoeVXBkYXRlRmVhdHVyZVRhcmdldGluZ1Jlc3BvbnNlIpQBChNDbG9uZUZlYXR1cmVSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJACgdjb21tYW5kGAIgASgLMiYuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIWChRDbG9uZUZlYXR1cmVSZXNwb25zZSLZAQoUQ3JlYXRlU2VnbWVudFJlcXVlc3QSVAoHY29tbWFuZBgBIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIXCgRuYW1lGAMgASgJQgPgQQJSBG5hbWUSKgoOZW52aXJvbm1lbnRfaWQYBCABKAlCA+BBAlINZW52aXJvbm1lbnRJZBIgCgtkZXNjcmlwdGlvbhgFIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiTQoVQ3JlYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IloKEUdldFNlZ21lbnRSZXF1ZXN0EhMKAmlkGAEgASgJQgPgQQJSAmlkEioKDmVudmlyb25tZW50X2lkGAMgASgJQgPgQQJSDWVudmlyb25tZW50SWRKBAgCEAMiSgoSR2V0U2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IssEChNMaXN0U2VnbWVudHNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSQoIb3JkZXJfYnkYBCABKA4yLi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSXgoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSMwoGc3RhdHVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSBnN0YXR1cxJDChBpc19pbl91c2Vfc3RhdHVzGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaXNJblVzZVN0YXR1cxIqCg5lbnZpcm9ubWVudF9pZBgJIAEoCUID4EECUg1lbnZpcm9ubWVudElkIlwKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0NPTk5FQ1RJT05TEAQSCQoFVVNFUlMQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgDEAQihwEKFExpc3RTZWdtZW50c1Jlc3BvbnNlEjYKCHNlZ21lbnRzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFIIc2VnbWVudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiqQEKFERlbGV0ZVNlZ21lbnRSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJUCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudENvbW1hbmRCERgBkkEMMgpkZXByZWNhdGVkUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhcKFURlbGV0ZVNlZ21lbnRSZXNwb25zZSKVAgoUVXBkYXRlU2VnbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkkKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSCGNvbW1hbmRzEioKDmVudmlyb25tZW50X2lkGAQgASgJQgPgQQJSDWVudmlyb25tZW50SWQSMAoEbmFtZRgFIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb25KBAgDEAQiTQoVVXBkYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IpgBChVBZGRTZWdtZW50VXNlclJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BZGRTZWdtZW50VXNlckNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGAoWQWRkU2VnbWVudFVzZXJSZXNwb25zZSKeAQoYRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJFCgdjb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhsKGURlbGV0ZVNlZ21lbnRVc2VyUmVzcG9uc2UiuAEKFUdldFNlZ21lbnRVc2VyUmVxdWVzdBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHdXNlcl9pZBgCIAEoCVIGdXNlcklkEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIkwKFkdldFNlZ21lbnRVc2VyUmVzcG9uc2USMgoEdXNlchgBIAEoCzIeLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyUgR1c2VyIuYBChdMaXN0U2VnbWVudFVzZXJzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh0KCnNlZ21lbnRfaWQYAyABKAlSCXNlZ21lbnRJZBIxCgVzdGF0ZRgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgVzdGF0ZRIXCgd1c2VyX2lkGAUgASgJUgZ1c2VySWQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWRKBAgGEAciaAoYTGlzdFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEjQKBXVzZXJzGAEgAygLMh4uYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXJSBXVzZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yItACCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIdCgpzZWdtZW50X2lkGAIgASgJUglzZWdtZW50SWQSXQoHY29tbWFuZBgDIAEoCzIwLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZBJICgRkYXRhGAUgASgMQjSSQTEyL3NlZ21lbnQgdXNlciBpZHMgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIG5ldyBsaW5lUgRkYXRhEjoKBXN0YXRlGAYgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlSgQIARACIiAKHkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSKzAQofQnVsa0Rvd25sb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIiCgpzZWdtZW50X2lkGAIgASgJQgPgQQJSCXNlZ21lbnRJZBI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIqCg5lbnZpcm9ubWVudF9pZBgEIAEoCUID4EECUg1lbnZpcm9ubWVudElkSgQIARACIjYKIEJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEhIKBGRhdGEYASABKAxSBGRhdGEioQEKF0V2YWx1YXRlRmVhdHVyZXNSZXF1ZXN0EigKBHVzZXIYASABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEhAKA3RhZxgDIAEoCVIDdGFnEh0KCmZlYXR1cmVfaWQYBCABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJpChhFdmFsdWF0ZUZlYXR1cmVzUmVzcG9uc2USTQoQdXNlcl9ldmFsdWF0aW9ucxgBIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlVzZXJFdmFsdWF0aW9uc1IPdXNlckV2YWx1YXRpb25zIqwDCg9MaXN0VGFnc1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchJFCghvcmRlcl9ieRgEIAEoDjIqLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EloKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjIxLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiSAoHT3JkZXJCeRILCgdERUZBVUxUEAASBgoCSUQQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBE5BTUUQBCIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIidwoQTGlzdFRhZ3NSZXNwb25zZRIqCgR0YWdzGAEgAygLMhYuYnVja2V0ZWVyLmZlYXR1cmUuVGFnUgR0YWdzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IrMBChhDcmVhdGVGbGFnVHJpZ2dlclJlcXVlc3QSagobY3JlYXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhjcmVhdGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIicAoZQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiwwEKGERlbGV0ZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZGVsZXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhkZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSLmAQoYVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBKMAQonY2hhbmdlX2ZsYWdfdHJpZ2dlcl9kZXNjcmlwdGlvbl9jb21tYW5kGAMgASgLMjYuYnVja2V0ZWVyLmZlYXR1cmUuQ2hhbmdlRmxhZ1RyaWdnZXJEZXNjcmlwdGlvbkNvbW1hbmRSI2NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIhsKGVVwZGF0ZUZsYWdUcmlnZ2VyUmVzcG9uc2UiwwEKGEVuYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZW5hYmxlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJDb21tYW5kUhhlbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSLHAQoZRGlzYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSbQocZGlzYWJsZV9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmRSGWRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiHAoaRGlzYWJsZUZsYWdUcmlnZ2VyUmVzcG9uc2UivwEKF1Jlc2V0RmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJnChpyZXNldF9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJDb21tYW5kUhdyZXNldEZsYWdUcmlnZ2VyQ29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJvChhSZXNldEZsYWdUcmlnZ2VyUmVzcG9uc2USQQoMZmxhZ190cmlnZ2VyGAEgASgLMh4uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJSC2ZsYWdUcmlnZ2VyEhAKA3VybBgCIAEoCVIDdXJsIlQKFUdldEZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMibQoWR2V0RmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiqgMKF0xpc3RGbGFnVHJpZ2dlcnNSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIbCglwYWdlX3NpemUYBCABKAVSCHBhZ2VTaXplEk0KCG9yZGVyX2J5GAUgASgOMjIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJiCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yOS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiNgoHT3JkZXJCeRILCgdERUZBVUxUEAASDgoKQ1JFQVRFRF9BVBABEg4KClVQREFURURfQVQQAiIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgCEAMiowIKGExpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZRJjCg1mbGFnX3RyaWdnZXJzGAEgAygLMj4uYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1Jlc3BvbnNlLkZsYWdUcmlnZ2VyV2l0aFVybFIMZmxhZ1RyaWdnZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50GmkKEkZsYWdUcmlnZ2VyV2l0aFVybBJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiMQoZRmxhZ1RyaWdnZXJXZWJob29rUmVxdWVzdBIUCgV0b2tlbhgBIAEoCVIFdG9rZW4iHAoaRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UymjkKDkZlYXR1cmVTZXJ2aWNlElsKCkdldEZlYXR1cmUSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRGZWF0dXJlUmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldEZlYXR1cmVSZXNwb25zZSIAEl4KC0dldEZlYXR1cmVzEiUuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXF1ZXN0GiYuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXNwb25zZSIAEmEKDExpc3RGZWF0dXJlcxImLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QaJy5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXNwb25zZSIAEnYKE0xpc3RFbmFibGVkRmVhdHVyZXMSLS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RW5hYmxlZEZlYXR1cmVzUmVxdWVzdBouLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZSIAEmQKDUNyZWF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5DcmVhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZUZlYXR1cmVSZXNwb25zZSIAEmQKDVVwZGF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVSZXNwb25zZSIAEmcKDUVuYWJsZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5FbmFibGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmoKDkRpc2FibGVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmcKDkFyY2hpdmVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEm0KEFVuYXJjaGl2ZUZlYXR1cmUSKi5idWNrZXRlZXIuZmVhdHVyZS5VbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEmQKDURlbGV0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5EZWxldGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVSZXNwb25zZSIAEnkKFFVwZGF0ZUZlYXR1cmVEZXRhaWxzEi4uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXF1ZXN0Gi8uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSIAEoIBChdVcGRhdGVGZWF0dXJlVmFyaWF0aW9ucxIxLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVxdWVzdBoyLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVzcG9uc2UiABJ/ChZVcGRhdGVGZWF0dXJlVGFyZ2V0aW5nEjAuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlVGFyZ2V0aW5nUmVzcG9uc2UiABJhCgxDbG9uZUZlYXR1cmUSJi5idWNrZXRlZXIuZmVhdHVyZS5DbG9uZUZlYXR1cmVSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlUmVzcG9uc2UiABKmBAoNQ3JlYXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlU2VnbWVudFJlc3BvbnNlIsEDkkGnAwoHc2VnbWVudBIGQ3JlYXRlGhFDcmVhdGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuY3JlYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCECILL3YxL3NlZ21lbnQ6ASoSkQQKCkdldFNlZ21lbnQSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRTZWdtZW50UmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldFNlZ21lbnRSZXNwb25zZSK1A5JBngMKB3NlZ21lbnQSA0dldBoOR2V0IGEgc2VnbWVudC4qEndlYi52MS5zZWdtZW50LmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg0SCy92MS9zZWdtZW50EpoECgxMaXN0U2VnbWVudHMSJi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVzcG9uc2UiuAOSQaADCgdzZWdtZW50EgRMaXN0Gg5MaXN0IHNlZ21lbnRzLioTd2ViLnYxLnNlZ21lbnQubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg4SDC92MS9zZWdtZW50cxKjBAoNRGVsZXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFJlc3BvbnNlIr4DkkGnAwoHc2VnbWVudBIGRGVsZXRlGhFEZWxldGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuZGVsZXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDSoLL3YxL3NlZ21lbnQSpgQKDVVwZGF0ZVNlZ21lbnQSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVTZWdtZW50UmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZVNlZ21lbnRSZXNwb25zZSLBA5JBpwMKB3NlZ21lbnQSBlVwZGF0ZRoRVXBkYXRlIGEgc2VnbWVudC4qFXdlYi52MS5zZWdtZW50LnVwZGF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhAyCy92MS9zZWdtZW50OgEqEmoKDkFkZFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEnMKEURlbGV0ZVNlZ21lbnRVc2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEmoKDkdldFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEm0KEExpc3RTZWdtZW50VXNlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudFVzZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RTZWdtZW50VXNlcnNSZXNwb25zZSIAEuwEChZCdWxrVXBsb2FkU2VnbWVudFVzZXJzEjAuYnVja2V0ZWVyLmZlYXR1cmUuQnVsa1VwbG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVzcG9uc2Ui7AOSQcADCgdzZWdtZW50EgtCdWxrIHVwbG9hZBoaQnVsayB1cGxvYWQgc2VnbWVudCB1c2Vycy4qIHdlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfdXBsb2FkSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCIiIdL3YxL3NlZ21lbnRfdXNlcnMvYnVsa191cGxvYWQ6ASoS9wQKGEJ1bGtEb3dubG9hZFNlZ21lbnRVc2VycxIyLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMy5idWNrZXRlZXIuZmVhdHVyZS5CdWxrRG93bmxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSLxA5JBxgMKB3NlZ21lbnQSDUJ1bGsgZG93bmxvYWQaHEJ1bGsgZG93bmxvYWQgc2VnbWVudCB1c2Vycy4qIndlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfZG93bmxvYWRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIhEh8vdjEvc2VnbWVudF91c2Vycy9idWxrX2Rvd25sb2FkEm0KEEV2YWx1YXRlRmVhdHVyZXMSKi5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0ZUZlYXR1cmVzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRlRmVhdHVyZXNSZXNwb25zZSIAElUKCExpc3RUYWdzEiIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXF1ZXN0GiMuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXNwb25zZSIAEnAKEUNyZWF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEVVwZGF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEUVuYWJsZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnMKEkRpc2FibGVGbGFnVHJpZ2dlchIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlclJlcXVlc3QaLS5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEFJlc2V0RmxhZ1RyaWdnZXISKi5idWNrZXRlZXIuZmVhdHVyZS5SZXNldEZsYWdUcmlnZ2VyUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEURlbGV0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEmcKDkdldEZsYWdUcmlnZ2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEExpc3RGbGFnVHJpZ2dlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZSIAEpQBChJGbGFnVHJpZ2dlcldlYmhvb2sSLC5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlcldlYmhvb2tSZXF1ZXN0Gi0uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UiIYLT5JMCGyIZL3dlYmhvb2svdHJpZ2dlcnMve3Rva2VufUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCpwDChVwcm90by9wdXNoL3B1c2gucHJvdG8SDmJ1Y2tldGVlci5wdXNoIroCCgRQdXNoEg4KAmlkGAEgASgJUgJpZBISCgR0YWdzGAMgAygJUgR0YWdzEhgKB2RlbGV0ZWQYBCABKAhSB2RlbGV0ZWQSEgoEbmFtZRgFIAEoCVIEbmFtZRIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0Ei4KE2ZjbV9zZXJ2aWNlX2FjY291bnQYCCABKAlSEWZjbVNlcnZpY2VBY2NvdW50EhoKCGRpc2FibGVkGAkgASgIUghkaXNhYmxlZBIlCg5lbnZpcm9ubWVudF9pZBgKIAEoCVINZW52aXJvbm1lbnRJZBIpChBlbnZpcm9ubWVudF9uYW1lGAsgASgJUg9lbnZpcm9ubWVudE5hbWVKBAgCEANCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3B1c2hiBnByb3RvMwrqAgoYcHJvdG8vcHVzaC9jb21tYW5kLnByb3RvEg5idWNrZXRlZXIucHVzaCJxChFDcmVhdGVQdXNoQ29tbWFuZBISCgR0YWdzGAIgAygJUgR0YWdzEhIKBG5hbWUYAyABKAlSBG5hbWUSLgoTZmNtX3NlcnZpY2VfYWNjb3VudBgEIAEoDFIRZmNtU2VydmljZUFjY291bnRKBAgBEAIiKAoSQWRkUHVzaFRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiKwoVRGVsZXRlUHVzaFRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiEwoRRGVsZXRlUHVzaENvbW1hbmQiJwoRUmVuYW1lUHVzaENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZUIuWixnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vcHVzaGIGcHJvdG8zCskhChhwcm90by9wdXNoL3NlcnZpY2UucHJvdG8SDmJ1Y2tldGVlci5wdXNoGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8aFXByb3RvL3B1c2gvcHVzaC5wcm90bxoYcHJvdG8vcHVzaC9jb21tYW5kLnByb3RvItkBChFDcmVhdGVQdXNoUmVxdWVzdBI/Cgdjb21tYW5kGAIgASgLMiEuYnVja2V0ZWVyLnB1c2guQ3JlYXRlUHVzaENvbW1hbmRCAhgBUgdjb21tYW5kEhIKBHRhZ3MYAyADKAlSBHRhZ3MSEgoEbmFtZRgEIAEoCVIEbmFtZRIuChNmY21fc2VydmljZV9hY2NvdW50GAUgASgMUhFmY21TZXJ2aWNlQWNjb3VudBIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiI+ChJDcmVhdGVQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2gioQQKEUxpc3RQdXNoZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISRAoIb3JkZXJfYnkYBCABKA4yKS5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5ElkKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjIwLmJ1Y2tldGVlci5wdXNoLkxpc3RQdXNoZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBIlCg5lbnZpcm9ubWVudF9pZBgHIAEoCVINZW52aXJvbm1lbnRJZBInCg9vcmdhbml6YXRpb25faWQYCCABKAlSDm9yZ2FuaXphdGlvbklkEjYKCGRpc2FibGVkGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQiXAoHT3JkZXJCeRILCgdERUZBVUxUEAASCAoETkFNRRABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMSDwoLRU5WSVJPTk1FTlQQBBIJCgVTVEFURRAFIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQAUoECAEQAiJ7ChJMaXN0UHVzaGVzUmVzcG9uc2USLAoGcHVzaGVzGAEgAygLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIGcHVzaGVzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50Io0BChFEZWxldGVQdXNoUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSOwoHY29tbWFuZBgDIAEoCzIhLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhQKEkRlbGV0ZVB1c2hSZXNwb25zZSLuAwoRVXBkYXRlUHVzaFJlcXVlc3QSEwoCaWQYAiABKAlCA+BBAlICaWQSWQoVYWRkX3B1c2hfdGFnc19jb21tYW5kGAMgASgLMiIuYnVja2V0ZWVyLnB1c2guQWRkUHVzaFRhZ3NDb21tYW5kQgIYAVISYWRkUHVzaFRhZ3NDb21tYW5kEmIKGGRlbGV0ZV9wdXNoX3RhZ3NfY29tbWFuZBgEIAEoCzIlLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hUYWdzQ29tbWFuZEICGAFSFWRlbGV0ZVB1c2hUYWdzQ29tbWFuZBJVChNyZW5hbWVfcHVzaF9jb21tYW5kGAUgASgLMiEuYnVja2V0ZWVyLnB1c2guUmVuYW1lUHVzaENvbW1hbmRCAhgBUhFyZW5hbWVQdXNoQ29tbWFuZBISCgR0YWdzGAYgAygJUgR0YWdzEjAKBG5hbWUYByABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSBG5hbWUSKgoOZW52aXJvbm1lbnRfaWQYCCABKAlCA+BBAlINZW52aXJvbm1lbnRJZBI2CghkaXNhYmxlZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkSgQIARACIj4KElVwZGF0ZVB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaCJRCg5HZXRQdXNoUmVxdWVzdBIqCg5lbnZpcm9ubWVudF9pZBgBIAEoCUID4EECUg1lbnZpcm9ubWVudElkEhMKAmlkGAIgASgJQgPgQQJSAmlkIjsKD0dldFB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaDKAEQoLUHVzaFNlcnZpY2UShAQKCkxpc3RQdXNoZXMSIS5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdBoiLmJ1Y2tldGVlci5wdXNoLkxpc3RQdXNoZXNSZXNwb25zZSKuA5JBmAMKBHB1c2gSBExpc3QaDExpc3QgcHVzaGVzLioQd2ViLnYxLnB1c2gubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgwSCi92MS9wdXNoZXMSiwQKCkNyZWF0ZVB1c2gSIS5idWNrZXRlZXIucHVzaC5DcmVhdGVQdXNoUmVxdWVzdBoiLmJ1Y2tldGVlci5wdXNoLkNyZWF0ZVB1c2hSZXNwb25zZSK1A5JBngMKBHB1c2gSBkNyZWF0ZRoOQ3JlYXRlIGEgcHVzaC4qEndlYi52MS5wdXNoLmNyZWF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg0iCC92MS9wdXNoOgEqEosECgpVcGRhdGVQdXNoEiEuYnVja2V0ZWVyLnB1c2guVXBkYXRlUHVzaFJlcXVlc3QaIi5idWNrZXRlZXIucHVzaC5VcGRhdGVQdXNoUmVzcG9uc2UitQOSQZ4DCgRwdXNoEgZVcGRhdGUaDlVwZGF0ZSBhIHB1c2guKhJ3ZWIudjEucHVzaC51cGRhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwINMggvdjEvcHVzaDoBKhL2AwoHR2V0UHVzaBIeLmJ1Y2tldGVlci5wdXNoLkdldFB1c2hSZXF1ZXN0Gh8uYnVja2V0ZWVyLnB1c2guR2V0UHVzaFJlc3BvbnNlIqkDkkGVAwoEcHVzaBIDR2V0GgtHZXQgYSBwdXNoLioPd2ViLnYxLnB1c2guZ2V0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCChIIL3YxL3B1c2gSVQoKRGVsZXRlUHVzaBIhLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hSZXF1ZXN0GiIuYnVja2V0ZWVyLnB1c2guRGVsZXRlUHVzaFJlc3BvbnNlIgBCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3B1c2hiBnByb3RvMwrnAwojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCLpAgoNRW52aXJvbm1lbnRWMhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SHQoKcHJvamVjdF9pZBgFIAEoCVIJcHJvamVjdElkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EicKD29yZ2FuaXphdGlvbl9pZBgJIAEoCVIOb3JnYW5pemF0aW9uSWQSJwoPcmVxdWlyZV9jb21tZW50GAogASgIUg5yZXF1aXJlQ29tbWVudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYCyABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMK/QMKH3Byb3RvL2Vudmlyb25tZW50L3Byb2plY3QucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCKDAwoHUHJvamVjdBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZRInCg9vcmdhbml6YXRpb25faWQYCiABKAlSDm9yZ2FuaXphdGlvbklkEisKEWVudmlyb25tZW50X2NvdW50GAsgASgFUhBlbnZpcm9ubWVudENvdW50EiwKEmZlYXR1cmVfZmxhZ19jb3VudBgMIAEoBVIQZmVhdHVyZUZsYWdDb3VudEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqvBAokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQisAMKDE9yZ2FuaXphdGlvbhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBIhCgxzeXN0ZW1fYWRtaW4YCiABKAhSC3N5c3RlbUFkbWluEiMKDXByb2plY3RfY291bnQYCyABKAVSDHByb2plY3RDb3VudBIrChFlbnZpcm9ubWVudF9jb3VudBgMIAEoBVIQZW52aXJvbm1lbnRDb3VudBIdCgp1c2VyX2NvdW50GA0gASgFUgl1c2VyQ291bnQSHwoLb3duZXJfZW1haWwYDiABKAlSCm93bmVyRW1haWxCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKkAMKIXByb3RvL2FjY291bnQvc2VhcmNoX2ZpbHRlci5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQi6QEKDFNlYXJjaEZpbHRlchIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIUCgVxdWVyeRgDIAEoCVIFcXVlcnkSUQoSZmlsdGVyX3RhcmdldF90eXBlGAQgASgOMiMuYnVja2V0ZWVyLmFjY291bnQuRmlsdGVyVGFyZ2V0VHlwZVIQZmlsdGVyVGFyZ2V0VHlwZRIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZBIlCg5kZWZhdWx0X2ZpbHRlchgGIAEoCFINZGVmYXVsdEZpbHRlcioxChBGaWx0ZXJUYXJnZXRUeXBlEgsKB1VOS05PV04QABIQCgxGRUFUVVJFX0ZMQUcQAUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCtQTChtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvGiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8iqwIKB0FjY291bnQSDgoCaWQYASABKAlSAmlkEhQKBWVtYWlsGAIgASgJUgVlbWFpbBISCgRuYW1lGAMgASgJUgRuYW1lEjMKBHJvbGUYBCABKA4yHy5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZCI5CgRSb2xlEgoKBlZJRVdFUhAAEgoKBkVESVRPUhABEgkKBU9XTkVSEAISDgoKVU5BU1NJR05FRBBjOgIYASK8CAoJQWNjb3VudFYyEhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEigKEGF2YXRhcl9pbWFnZV91cmwYAyABKAlSDmF2YXRhckltYWdlVXJsEicKD29yZ2FuaXphdGlvbl9pZBgEIAEoCVIOb3JnYW5pemF0aW9uSWQSWwoRb3JnYW5pemF0aW9uX3JvbGUYBSABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEhoKCGRpc2FibGVkGAcgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0EkYKDnNlYXJjaF9maWx0ZXJzGAogAygLMh8uYnVja2V0ZWVyLmFjY291bnQuU2VhcmNoRmlsdGVyUg1zZWFyY2hGaWx0ZXJzEh0KCmZpcnN0X25hbWUYCyABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYDCABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGA0gASgJUghsYW5ndWFnZRIbCglsYXN0X3NlZW4YDiABKANSCGxhc3RTZWVuEigKEGF2YXRhcl9maWxlX3R5cGUYDyABKAlSDmF2YXRhckZpbGVUeXBlEiEKDGF2YXRhcl9pbWFnZRgQIAEoDFILYXZhdGFySW1hZ2USKwoRZW52aXJvbm1lbnRfY291bnQYESABKAVSEGVudmlyb25tZW50Q291bnQSEgoEdGFncxgSIAMoCVIEdGFncxrXAQoEUm9sZSJZCgtFbnZpcm9ubWVudBIaChZFbnZpcm9ubWVudF9VTkFTU0lHTkVEEAASFgoSRW52aXJvbm1lbnRfVklFV0VSEAESFgoSRW52aXJvbm1lbnRfRURJVE9SEAIidAoMT3JnYW5pemF0aW9uEhsKF09yZ2FuaXphdGlvbl9VTkFTU0lHTkVEEAASFwoTT3JnYW5pemF0aW9uX01FTUJFUhABEhYKEk9yZ2FuaXphdGlvbl9BRE1JThACEhYKEk9yZ2FuaXphdGlvbl9PV05FUhADGnsKD0Vudmlyb25tZW50Um9sZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBJBCgRyb2xlGAIgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGUi6gYKDkNvbnNvbGVBY2NvdW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmF2YXRhcl91cmwYAyABKAlSCWF2YXRhclVybBImCg9pc19zeXN0ZW1fYWRtaW4YBCABKAhSDWlzU3lzdGVtQWRtaW4SRwoMb3JnYW5pemF0aW9uGAUgASgLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblIMb3JnYW5pemF0aW9uElsKEW9yZ2FuaXphdGlvbl9yb2xlGAYgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlEl4KEWVudmlyb25tZW50X3JvbGVzGAcgAygLMjEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnQuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEkYKDnNlYXJjaF9maWx0ZXJzGAggAygLMh8uYnVja2V0ZWVyLmFjY291bnQuU2VhcmNoRmlsdGVyUg1zZWFyY2hGaWx0ZXJzEh0KCmZpcnN0X25hbWUYCSABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCiABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAsgASgJUghsYW5ndWFnZRIoChBhdmF0YXJfZmlsZV90eXBlGAwgASgJUg5hdmF0YXJGaWxlVHlwZRIhCgxhdmF0YXJfaW1hZ2UYDSABKAxSC2F2YXRhckltYWdlEhsKCWxhc3Rfc2VlbhgOIAEoA1IIbGFzdFNlZW4a1gEKD0Vudmlyb25tZW50Um9sZRJGCgtlbnZpcm9ubWVudBgBIAEoCzIkLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFYyUgtlbnZpcm9ubWVudBI4Cgdwcm9qZWN0GAIgASgLMh4uYnVja2V0ZWVyLmVudmlyb25tZW50LlByb2plY3RSB3Byb2plY3QSQQoEcm9sZRgDIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLkVudmlyb25tZW50UgRyb2xlQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMK5gYKG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQaI3Byb3RvL2Vudmlyb25tZW50L2Vudmlyb25tZW50LnByb3RvIrsDCgZBUElLZXkSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSMgoEcm9sZRgDIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Eh4KCm1haW50YWluZXIYByABKAlSCm1haW50YWluZXISFwoHYXBpX2tleRgIIAEoCVIGYXBpS2V5EiAKC2Rlc2NyaXB0aW9uGAkgASgJUgtkZXNjcmlwdGlvbhIpChBlbnZpcm9ubWVudF9uYW1lGAogASgJUg9lbnZpcm9ubWVudE5hbWUieQoEUm9sZRILCgdVTktOT1dOEAASDgoKU0RLX0NMSUVOVBABEg4KClNES19TRVJWRVIQAhIYChRQVUJMSUNfQVBJX1JFQURfT05MWRADEhQKEFBVQkxJQ19BUElfV1JJVEUQBBIUChBQVUJMSUNfQVBJX0FETUlOEAUilQIKEUVudmlyb25tZW50QVBJS2V5EjIKB2FwaV9rZXkYAiABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleRIxChRlbnZpcm9ubWVudF9kaXNhYmxlZBgDIAEoCFITZW52aXJvbm1lbnREaXNhYmxlZBIhCgpwcm9qZWN0X2lkGAQgASgJQgIYAVIJcHJvamVjdElkEkYKC2Vudmlyb25tZW50GAUgASgLMiQuYnVja2V0ZWVyLmVudmlyb25tZW50LkVudmlyb25tZW50VjJSC2Vudmlyb25tZW50EigKEHByb2plY3RfdXJsX2NvZGUYBiABKAlSDnByb2plY3RVcmxDb2RlSgQIARACQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMKnBIKG3Byb3RvL2FjY291bnQvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQaG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvGiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8ikAMKFkNyZWF0ZUFjY291bnRWMkNvbW1hbmQSFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBCABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBSADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEh0KCmZpcnN0X25hbWUYBiABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYByABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAggASgJUghsYW5ndWFnZRISCgR0YWdzGAkgAygJUgR0YWdzIjAKGkNoYW5nZUFjY291bnRWMk5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiQAofQ2hhbmdlQWNjb3VudFYyRmlyc3ROYW1lQ29tbWFuZBIdCgpmaXJzdF9uYW1lGAEgASgJUglmaXJzdE5hbWUiPQoeQ2hhbmdlQWNjb3VudFYyTGFzdE5hbWVDb21tYW5kEhsKCWxhc3RfbmFtZRgBIAEoCVIIbGFzdE5hbWUiPAoeQ2hhbmdlQWNjb3VudFYyTGFuZ3VhZ2VDb21tYW5kEhoKCGxhbmd1YWdlGAEgASgJUghsYW5ndWFnZSJQCiRDaGFuZ2VBY2NvdW50VjJBdmF0YXJJbWFnZVVybENvbW1hbmQSKAoQYXZhdGFyX2ltYWdlX3VybBgBIAEoCVIOYXZhdGFySW1hZ2VVcmwiawocQ2hhbmdlQWNjb3VudFYyQXZhdGFyQ29tbWFuZBIhCgxhdmF0YXJfaW1hZ2UYASABKAxSC2F2YXRhckltYWdlEigKEGF2YXRhcl9maWxlX3R5cGUYAiABKAlSDmF2YXRhckZpbGVUeXBlIjAKGkNoYW5nZUFjY291bnRWMlRhZ3NDb21tYW5kEhIKBHRhZ3MYASADKAlSBHRhZ3MiPQoeQ2hhbmdlQWNjb3VudFYyTGFzdFNlZW5Db21tYW5kEhsKCWxhc3Rfc2VlbhgBIAEoA1IIbGFzdFNlZW4ibAomQ2hhbmdlQWNjb3VudFYyT3JnYW5pemF0aW9uUm9sZUNvbW1hbmQSQgoEcm9sZRgBIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIEcm9sZSKlAgomQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmQSQgoFcm9sZXMYASADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUgVyb2xlcxJiCgp3cml0ZV90eXBlGAIgASgOMkMuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmQuV3JpdGVUeXBlUgl3cml0ZVR5cGUiUwoJV3JpdGVUeXBlEhkKFVdyaXRlVHlwZV9VTlNQRUNJRklFRBAAEhYKEldyaXRlVHlwZV9PVkVSUklERRABEhMKD1dyaXRlVHlwZV9QQVRDSBACIhgKFkVuYWJsZUFjY291bnRWMkNvbW1hbmQiGQoXRGlzYWJsZUFjY291bnRWMkNvbW1hbmQiGAoWRGVsZXRlQWNjb3VudFYyQ29tbWFuZCJdChNDcmVhdGVBUElLZXlDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUSMgoEcm9sZRgCIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlIi0KF0NoYW5nZUFQSUtleU5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiFQoTRW5hYmxlQVBJS2V5Q29tbWFuZCIWChREaXNhYmxlQVBJS2V5Q29tbWFuZCLmAQoZQ3JlYXRlU2VhcmNoRmlsdGVyQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lEhQKBXF1ZXJ5GAIgASgJUgVxdWVyeRJRChJmaWx0ZXJfdGFyZ2V0X3R5cGUYAyABKA4yIy5idWNrZXRlZXIuYWNjb3VudC5GaWx0ZXJUYXJnZXRUeXBlUhBmaWx0ZXJUYXJnZXRUeXBlEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkEiUKDmRlZmF1bHRfZmlsdGVyGAUgASgIUg1kZWZhdWx0RmlsdGVyIkMKHUNoYW5nZVNlYXJjaEZpbHRlck5hbWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIkYKHkNoYW5nZVNlYXJjaEZpbHRlclF1ZXJ5Q29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFAoFcXVlcnkYAiABKAlSBXF1ZXJ5IlkKIENoYW5nZURlZmF1bHRTZWFyY2hGaWx0ZXJDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIlCg5kZWZhdWx0X2ZpbHRlchgCIAEoCFINZGVmYXVsdEZpbHRlciIrChlEZWxldGVTZWFyY2hGaWx0ZXJDb21tYW5kEg4KAmlkGAEgASgJUgJpZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCta/AQobcHJvdG8vYWNjb3VudC9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxobcHJvdG8vYWNjb3VudC9jb21tYW5kLnByb3RvGiRwcm90by9lbnZpcm9ubWVudC9vcmdhbml6YXRpb24ucHJvdG8iNwoMR2V0TWVSZXF1ZXN0EicKD29yZ2FuaXphdGlvbl9pZBgBIAEoCVIOb3JnYW5pemF0aW9uSWQiTAoNR2V0TWVSZXNwb25zZRI7CgdhY2NvdW50GAEgASgLMiEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnRSB2FjY291bnQiGwoZR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdCI4CiBHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiZwoaR2V0TXlPcmdhbml6YXRpb25zUmVzcG9uc2USSQoNb3JnYW5pemF0aW9ucxgBIAMoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDW9yZ2FuaXphdGlvbnMiggQKFkNyZWF0ZUFjY291bnRWMlJlcXVlc3QSJwoPb3JnYW5pemF0aW9uX2lkGAEgASgJUg5vcmdhbml6YXRpb25JZBJHCgdjb21tYW5kGAIgASgLMikuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQSFAoFZW1haWwYAyABKAlSBWVtYWlsEhIKBG5hbWUYBCABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgFIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYByADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEh0KCmZpcnN0X25hbWUYCCABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCSABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAogASgJUghsYW5ndWFnZRISCgR0YWdzGAsgAygJUgR0YWdzIlEKF0NyZWF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkVuYWJsZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIlEKF0VuYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiogEKF0Rpc2FibGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEkgKB2NvbW1hbmQYAyABKAsyKi5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQiUgoYRGlzYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkRlbGV0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIhkKF0RlbGV0ZUFjY291bnRWMlJlc3BvbnNlIt0QChZVcGRhdGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEmEKE2NoYW5nZV9uYW1lX2NvbW1hbmQYAyABKAsyLS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJOYW1lQ29tbWFuZEICGAFSEWNoYW5nZU5hbWVDb21tYW5kEnYKGWNoYW5nZV9hdmF0YXJfdXJsX2NvbW1hbmQYBCABKAsyNy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJJbWFnZVVybENvbW1hbmRCAhgBUhZjaGFuZ2VBdmF0YXJVcmxDb21tYW5kEoYBCiBjaGFuZ2Vfb3JnYW5pemF0aW9uX3JvbGVfY29tbWFuZBgFIAEoCzI5LmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMk9yZ2FuaXphdGlvblJvbGVDb21tYW5kQgIYAVIdY2hhbmdlT3JnYW5pemF0aW9uUm9sZUNvbW1hbmQShgEKIGNoYW5nZV9lbnZpcm9ubWVudF9yb2xlc19jb21tYW5kGAYgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmRCAhgBUh1jaGFuZ2VFbnZpcm9ubWVudFJvbGVzQ29tbWFuZBJxChljaGFuZ2VfZmlyc3RfbmFtZV9jb21tYW5kGAcgASgLMjIuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRmlyc3ROYW1lQ29tbWFuZEICGAFSFmNoYW5nZUZpcnN0TmFtZUNvbW1hbmQSbgoYY2hhbmdlX2xhc3RfbmFtZV9jb21tYW5kGAggASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFzdE5hbWVDb21tYW5kQgIYAVIVY2hhbmdlTGFzdE5hbWVDb21tYW5kEm0KF2NoYW5nZV9sYW5ndWFnZV9jb21tYW5kGAkgASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFuZ3VhZ2VDb21tYW5kQgIYAVIVY2hhbmdlTGFuZ3VhZ2VDb21tYW5kEm4KGGNoYW5nZV9sYXN0X3NlZW5fY29tbWFuZBgKIAEoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMkxhc3RTZWVuQ29tbWFuZEICGAFSFWNoYW5nZUxhc3RTZWVuQ29tbWFuZBJnChVjaGFuZ2VfYXZhdGFyX2NvbW1hbmQYCyABKAsyLy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJDb21tYW5kQgIYAVITY2hhbmdlQXZhdGFyQ29tbWFuZBIwCgRuYW1lGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEkYKEGF2YXRhcl9pbWFnZV91cmwYDSABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSDmF2YXRhckltYWdlVXJsEmwKEW9yZ2FuaXphdGlvbl9yb2xlGA4gASgLMj8uYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5Pcmdhbml6YXRpb25Sb2xlVmFsdWVSEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYDyADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEjsKCmZpcnN0X25hbWUYECABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCWZpcnN0TmFtZRI5CglsYXN0X25hbWUYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCGxhc3ROYW1lEjgKCGxhbmd1YWdlGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUghsYW5ndWFnZRI4CglsYXN0X3NlZW4YEyABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVIIbGFzdFNlZW4SUQoGYXZhdGFyGBQgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5BY2NvdW50VjJBdmF0YXJSBmF2YXRhchI2CghkaXNhYmxlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkEhIKBHRhZ3MYFiADKAlSBHRhZ3MSYQoTY2hhbmdlX3RhZ3NfY29tbWFuZBgXIAEoCzItLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMlRhZ3NDb21tYW5kQgIYAVIRY2hhbmdlVGFnc0NvbW1hbmQaXgoPQWNjb3VudFYyQXZhdGFyEiEKDGF2YXRhcl9pbWFnZRgBIAEoDFILYXZhdGFySW1hZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgCIAEoCVIOYXZhdGFyRmlsZVR5cGUaWwoVT3JnYW5pemF0aW9uUm9sZVZhbHVlEkIKBHJvbGUYASABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SBHJvbGUiUQoXVXBkYXRlQWNjb3VudFYyUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCJUChNHZXRBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkIk4KFEdldEFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiYQoiR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiXQojR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCKpBgoVTGlzdEFjY291bnRzVjJSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISJwoPb3JnYW5pemF0aW9uX2lkGAMgASgJUg5vcmdhbml6YXRpb25JZBJLCghvcmRlcl9ieRgEIAEoDjIwLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmAKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI3LmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZBJIChFvcmdhbml6YXRpb25fcm9sZRgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhBvcmdhbml6YXRpb25Sb2xlEkMKDmVudmlyb25tZW50X2lkGAkgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUg1lbnZpcm9ubWVudElkEkYKEGVudmlyb25tZW50X3JvbGUYCiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIPZW52aXJvbm1lbnRSb2xlEhIKBHRhZ3MYCyADKAlSBHRhZ3MikwEKB09yZGVyQnkSCwoHREVGQVVMVBAAEgkKBUVNQUlMEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIVChFPUkdBTklaQVRJT05fUk9MRRAEEhUKEUVOVklST05NRU5UX0NPVU5UEAUSDQoJTEFTVF9TRUVOEAYSCQoFU1RBVEUQBxIICgRUQUdTEAgiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABIosBChZMaXN0QWNjb3VudHNWMlJlc3BvbnNlEjgKCGFjY291bnRzGAEgAygLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUghhY2NvdW50cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAgoTQ3JlYXRlQVBJS2V5UmVxdWVzdBJECgdjb21tYW5kGAEgASgLMiYuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQVBJS2V5Q29tbWFuZEICGAFSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWQSEgoEbmFtZRgEIAEoCVIEbmFtZRIyCgRyb2xlGAUgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSHgoKbWFpbnRhaW5lchgGIAEoCVIKbWFpbnRhaW5lchIgCgtkZXNjcmlwdGlvbhgHIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiSgoUQ3JlYXRlQVBJS2V5UmVzcG9uc2USMgoHYXBpX2tleRgBIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5IpwBChdDaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhoKGENoYW5nZUFQSUtleU5hbWVSZXNwb25zZSKUAQoTRW5hYmxlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQAoHY29tbWFuZBgCIAEoCzImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFgoURW5hYmxlQVBJS2V5UmVzcG9uc2UilgEKFERpc2FibGVBUElLZXlSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJBCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGlzYWJsZUFQSUtleVJlc3BvbnNlIk8KEEdldEFQSUtleVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkcKEUdldEFQSUtleVJlc3BvbnNlEjIKB2FwaV9rZXkYASABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleSLmBAoSTGlzdEFQSUtleXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSAoIb3JkZXJfYnkYBCABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJdCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSKQoOZW52aXJvbm1lbnRfaWQYCCABKAlCAhgBUg1lbnZpcm9ubWVudElkEicKD2Vudmlyb25tZW50X2lkcxgJIAMoCVIOZW52aXJvbm1lbnRJZHMSLAoPb3JnYW5pemF0aW9uX2lkGAogASgJQgPgQQJSDm9yZ2FuaXphdGlvbklkImYKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBFJPTEUQBBIPCgtFTlZJUk9OTUVOVBAFEgkKBVNUQVRFEAYiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIAxAEIoQBChNMaXN0QVBJS2V5c1Jlc3BvbnNlEjQKCGFwaV9rZXlzGAEgAygLMhkuYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5UgdhcGlLZXlzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IjYKG0dldEVudmlyb25tZW50QVBJS2V5UmVxdWVzdBIXCgdhcGlfa2V5GAIgASgJUgZhcGlLZXkidAocR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZRJUChNlbnZpcm9ubWVudF9hcGlfa2V5GAEgASgLMiQuYnVja2V0ZWVyLmFjY291bnQuRW52aXJvbm1lbnRBUElLZXlSEWVudmlyb25tZW50QXBpS2V5IskBChlDcmVhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEkYKB2NvbW1hbmQYBCABKAsyLC5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJDb21tYW5kUgdjb21tYW5kIhwKGkNyZWF0ZVNlYXJjaEZpbHRlclJlc3BvbnNlIsADChlVcGRhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEmAKE2NoYW5nZV9uYW1lX2NvbW1hbmQYBCABKAsyMC5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJOYW1lQ29tbWFuZFIRY2hhbmdlTmFtZUNvbW1hbmQSYwoUY2hhbmdlX3F1ZXJ5X2NvbW1hbmQYBSABKAsyMS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJRdWVyeUNvbW1hbmRSEmNoYW5nZVF1ZXJ5Q29tbWFuZBJ2Ch1jaGFuZ2VfZGVmYXVsdF9maWx0ZXJfY29tbWFuZBgGIAEoCzIzLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZURlZmF1bHRTZWFyY2hGaWx0ZXJDb21tYW5kUhpjaGFuZ2VEZWZhdWx0RmlsdGVyQ29tbWFuZCIcChpVcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLJAQoZRGVsZXRlU2VhcmNoRmlsdGVyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZBIlCg5lbnZpcm9ubWVudF9pZBgDIAEoCVINZW52aXJvbm1lbnRJZBJGCgdjb21tYW5kGAQgASgLMiwuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlU2VhcmNoRmlsdGVyQ29tbWFuZFIHY29tbWFuZCIcChpEZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLoAgoTVXBkYXRlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQSMAoEbmFtZRgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb24SMgoEcm9sZRgFIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSPAoKbWFpbnRhaW5lchgHIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIKbWFpbnRhaW5lciIWChRVcGRhdGVBUElLZXlSZXNwb25zZTLOegoOQWNjb3VudFNlcnZpY2USngQKBUdldE1lEh8uYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXF1ZXN0GiAuYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXNwb25zZSLRA5JBswMKB0FjY291bnQSBkdldCBNZRodR2V0IHRoZSB1c2VyIGNvbnNvbGUgYWNjb3VudC4qFXdlYi52MS5hY2NvdW50LmdldF9tZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhQSEi92MS9hY2NvdW50L2dldF9tZRL4BAoSR2V0TXlPcmdhbml6YXRpb25zEiwuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdBotLmJ1Y2tldGVlci5hY2NvdW50LkdldE15T3JnYW5pemF0aW9uc1Jlc3BvbnNlIoQEkkHcAwoHQWNjb3VudBIUR2V0IE15IE9yZ2FuaXphdGlvbnMaLkdldCBhbGwgdGhlIG9yZ2FuaXphdGlvbnMgZm9yIGEgc3BlY2lmaWMgdXNlci4qH3dlYi52MS5hY2NvdW50Lm15X29yZ2FuaXphdGlvbnNKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIeEhwvdjEvYWNjb3VudC9teV9vcmdhbml6YXRpb25zEpYFChlHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsEjMuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zQnlFbWFpbFJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5HZXRNeU9yZ2FuaXphdGlvbnNSZXNwb25zZSKUBJJB4wMKB0FjY291bnQSHUdldCBNeSBPcmdhbml6YXRpb25zIEJ5IEVtYWlsGiNHZXQgYWxsIHRoZSBvcmdhbml6YXRpb25zIGJ5IGVtYWlsLiood2ViLnYxLmFjY291bnQubXlfb3JnYW5pemF0aW9uc19ieV9lbWFpbEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAicSJS92MS9hY2NvdW50L215X29yZ2FuaXphdGlvbnNfYnlfZW1haWwSugYKD0NyZWF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBY2NvdW50VjJSZXNwb25zZSLPBZJBpgUKB0FjY291bnQSBkNyZWF0ZRpcQ3JlYXRlIGFuIGFjY291bnQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbnNvbGUuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmNyZWF0ZV9hY2NvdW50SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2NyZWF0ZV9hY2NvdW50OgEqEs4DCg9FbmFibGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuRW5hYmxlQWNjb3VudFYyUmVzcG9uc2Ui4wKSQboCCgdBY2NvdW50EgZFbmFibGUaXEVuYWJsZSBhbiBhY2NvdW50IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC5lbmFibGVfYWNjb3VudEqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hY2NvdW50OgEqEsIGChBEaXNhYmxlQWNjb3VudFYyEiouYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFjY291bnRWMlJlcXVlc3QaKy5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyUmVzcG9uc2Ui1AWSQaoFCgdBY2NvdW50EgdEaXNhYmxlGl5EaXNhYmxlIGFuIGFjY291bnQgdG8gYmxvY2sgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh53ZWIudjEuYWNjb3VudC5kaXNhYmxlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCICIbL3YxL2FjY291bnQvZGlzYWJsZV9hY2NvdW50OgEqEpwGCg9VcGRhdGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVzcG9uc2UisQWSQYgFCgdBY2NvdW50EgZVcGRhdGUaPlVwZGF0ZSBhbiBhY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC51cGRhdGVfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIfIhovdjEvYWNjb3VudC91cGRhdGVfYWNjb3VudDoBKhKcBgoPRGVsZXRlQWNjb3VudFYyEikuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlQWNjb3VudFYyUmVxdWVzdBoqLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMlJlc3BvbnNlIrEFkkGIBQoHQWNjb3VudBIGRGVsZXRlGj5EZWxldGUgYW4gYWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuZGVsZXRlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvZGVsZXRlX2FjY291bnQ6ASoSrAQKDEdldEFjY291bnRWMhImLmJ1Y2tldGVlci5hY2NvdW50LkdldEFjY291bnRWMlJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJSZXNwb25zZSLKA5JBpwMKB0FjY291bnQSA0dldBoPR2V0IGFuIGFjY291bnQuKhp3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hY2NvdW50Ep0FChtHZXRBY2NvdW50VjJCeUVudmlyb25tZW50SUQSNS5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJCeUVudmlyb25tZW50SURSZXF1ZXN0GjYuYnVja2V0ZWVyLmFjY291bnQuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2UijgSSQdwDCgdBY2NvdW50EhpHZXQgQWNjb3VudCBCeSBFbnZpcm9ubWVudBoeR2V0IGFuIGFjY291bnQgYnkgZW52aXJvbm1lbnQuKil3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudF9ieV9lbnZpcm9ubWVudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAigSJi92MS9hY2NvdW50L2dldF9hY2NvdW50X2J5X2Vudmlyb25tZW50ErYECg5MaXN0QWNjb3VudHNWMhIoLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdBopLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVzcG9uc2UizgOSQakDCgdBY2NvdW50EgRMaXN0Gg5MaXN0IGFjY291bnRzLiocd2ViLnYxLmFjY291bnQubGlzdF9hY2NvdW50c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYWNjb3VudHMSsAYKDENyZWF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBUElLZXlSZXNwb25zZSLOBZJBpQUKB0FQSSBLZXkSBkNyZWF0ZRpbQ3JlYXRlIGFuIEFQSSBrZXkgdG8gYmUgdXNlZCBvbiB0aGUgY2xpZW50IFNESy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuY3JlYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvY3JlYXRlX2FwaV9rZXk6ASoSvAYKEENoYW5nZUFQSUtleU5hbWUSKi5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBorLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVSZXNwb25zZSLOBZJBoAUKB0FQSSBLZXkSE0NoYW5nZSBBUEkgS2V5IE5hbWUaRENoYW5nZSB0aGUgQVBJIEtleSBOYW1lLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKiJ3ZWIudjEuYWNjb3VudC5jaGFuZ2VfYXBpX2tleV9uYW1lSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiQiHy92MS9hY2NvdW50L2NoYW5nZV9hcGlfa2V5X25hbWU6ASoSkwYKDEVuYWJsZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBUElLZXlSZXNwb25zZSKxBZJBiAUKB0FQSSBLZXkSBkVuYWJsZRo+RW5hYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmVuYWJsZV9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hcGlfa2V5OgEqEpoGCg1EaXNhYmxlQVBJS2V5EicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleVJlcXVlc3QaKC5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQVBJS2V5UmVzcG9uc2UitQWSQYsFCgdBUEkgS2V5EgdEaXNhYmxlGj9EaXNhYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHndlYi52MS5hY2NvdW50LmRpc2FibGVfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIgIhsvdjEvYWNjb3VudC9kaXNhYmxlX2FwaV9rZXk6ASoSowQKCUdldEFQSUtleRIjLmJ1Y2tldGVlci5hY2NvdW50LkdldEFQSUtleVJlcXVlc3QaJC5idWNrZXRlZXIuYWNjb3VudC5HZXRBUElLZXlSZXNwb25zZSLKA5JBpwMKB0FQSSBLZXkSA0dldBoPR2V0IGFuIEFQSSBLZXkuKhp3ZWIudjEuYWNjb3VudC5nZXRfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hcGlfa2V5Eq0ECgtMaXN0QVBJS2V5cxIlLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVxdWVzdBomLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVzcG9uc2UizgOSQakDCgdBUEkgS2V5EgRMaXN0Gg5MaXN0IEFQSSBLZXlzLiocd2ViLnYxLmFjY291bnQubGlzdF9hcGlfa2V5c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYXBpX2tleXMS/AQKFEdldEVudmlyb25tZW50QVBJS2V5Ei4uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXF1ZXN0Gi8uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZSKCBJJB0wMKB0FQSSBLZXkSF0dldCBFbnZpcm9ubWVudCBBUEkgS2V5GhtHZXQgYW4gZW52aXJvbm1lbnQgQVBJIEtleS4qJndlYi52MS5hY2NvdW50LmdldF9lbnZpcm9ubWVudF9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJRIjL3YxL2FjY291bnQvZ2V0X2Vudmlyb25tZW50X2FwaV9rZXkSxQYKEkNyZWF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFENyZWF0ZSBTZWFyY2ggRmlsdGVyGkRDcmVhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuY3JlYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvY3JlYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKElVwZGF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFFVwZGF0ZSBTZWFyY2ggRmlsdGVyGkRVcGRhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQudXBkYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvdXBkYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKEkRlbGV0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5EZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFERlbGV0ZSBTZWFyY2ggRmlsdGVyGkREZWxldGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuZGVsZXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvZGVsZXRlX3NlYXJjaF9maWx0ZXI6ASoSmwYKDFVwZGF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBUElLZXlSZXNwb25zZSK5BZJBkAUKB0FQSSBLZXkSDlVwZGF0ZSBBUEkgS2V5Gj5VcGRhdGUgYW4gQVBJIEtleS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQudXBkYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHzIaL3YxL2FjY291bnQvdXBkYXRlX2FwaV9rZXk6ASpCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwr7AQoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvEg9nb29nbGUucHJvdG9idWYiOgoIRHVyYXRpb24SGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbmFub3NCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDUR1cmF0aW9uUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZHVyYXRpb25wYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCsY0Ch5wcm90by9ldmVudC9jbGllbnQvZXZlbnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5jbGllbnQaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvGhpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxoVcHJvdG8vdXNlci91c2VyLnByb3RvInAKBUV2ZW50Eg4KAmlkGAEgASgJUgJpZBIqCgVldmVudBgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBWV2ZW50EiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIpIECg9FdmFsdWF0aW9uRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SFwoHdXNlcl9pZBgEIAEoCVIGdXNlcklkEiEKDHZhcmlhdGlvbl9pZBgFIAEoCVILdmFyaWF0aW9uSWQSKAoEdXNlchgGIAEoCzIULmJ1Y2tldGVlci51c2VyLlVzZXJSBHVzZXISMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SEAoDdGFnGAggASgJUgN0YWcSPQoJc291cmNlX2lkGAkgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YCiABKAlSCnNka1ZlcnNpb24SUQoIbWV0YWRhdGEYCyADKAsyNS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkV2YWx1YXRpb25FdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi3AMKCUdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgDIAEoCVIGdXNlcklkEhQKBXZhbHVlGAQgASgBUgV2YWx1ZRIoCgR1c2VyGAUgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchJDCgtldmFsdWF0aW9ucxgGIAMoCzIdLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRpb25CAhgBUgtldmFsdWF0aW9ucxIQCgN0YWcYByABKAlSA3RhZxI9Cglzb3VyY2VfaWQYCCABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgJIAEoCVIKc2RrVmVyc2lvbhJLCghtZXRhZGF0YRgKIAMoCzIvLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR29hbEV2ZW50Lk1ldGFkYXRhRW50cnlSCG1ldGFkYXRhGjsKDU1ldGFkYXRhRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAgoMTWV0cmljc0V2ZW50EhwKCXRpbWVzdGFtcBgBIAEoA1IJdGltZXN0YW1wEioKBWV2ZW50GAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIFZXZlbnQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBCABKAlSCnNka1ZlcnNpb24STgoIbWV0YWRhdGEYBSADKAsyMi5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk1ldHJpY3NFdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9gEKIEdldEV2YWx1YXRpb25MYXRlbmN5TWV0cmljc0V2ZW50ElwKBmxhYmVscxgBIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvbkxhdGVuY3lNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxI1CghkdXJhdGlvbhgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIIZHVyYXRpb24aOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AToCGAEi1gEKHUdldEV2YWx1YXRpb25TaXplTWV0cmljc0V2ZW50ElkKBmxhYmVscxgBIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvblNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAiABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE6AhgBIrkCChNMYXRlbmN5TWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEk8KBmxhYmVscxgCIAMoCzI3LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTGF0ZW5jeU1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzEjkKCGR1cmF0aW9uGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgIYAVIIZHVyYXRpb24SJQoObGF0ZW5jeV9zZWNvbmQYBCABKAFSDWxhdGVuY3lTZWNvbmQaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLuAQoQU2l6ZU1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJMCgZsYWJlbHMYAiADKAsyNC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAyABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiNQodVGltZW91dEVycm9yQ291bnRNZXRyaWNzRXZlbnQSEAoDdGFnGAEgASgJUgN0YWc6AhgBIjYKHkludGVybmFsRXJyb3JDb3VudE1ldHJpY3NFdmVudBIQCgN0YWcYASABKAlSA3RhZzoCGAEi8QEKIFJlZGlyZWN0aW9uUmVxdWVzdEV4Y2VwdGlvbkV2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElwKBmxhYmVscxgCIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuUmVkaXJlY3Rpb25SZXF1ZXN0RXhjZXB0aW9uRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIucBChtCYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVwoGbGFiZWxzGAIgAygLMj8uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5CYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIusBCh1VbmF1dGhvcml6ZWRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJZCgZsYWJlbHMYAiADKAsyQS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlVuYXV0aG9yaXplZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLlAQoaRm9yYmlkZGVuRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVgoGbGFiZWxzGAIgAygLMj4uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Gb3JiaWRkZW5FcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGU5vdEZvdW5kRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Ob3RGb3VuZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLrAQodUGF5bG9hZFRvb0xhcmdlRXhjZXB0aW9uRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWQoGbGFiZWxzGAIgAygLMkEuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5QYXlsb2FkVG9vTGFyZ2VFeGNlcHRpb25FdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi+QEKJENsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJgCgZsYWJlbHMYAiADKAsySC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkNsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi7wEKH0ludGVybmFsU2VydmVyRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWwoGbGFiZWxzGAIgAygLMkMuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbFNlcnZlckVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASL3AQojU2VydmljZVVuYXZhaWxhYmxlRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSXwoGbGFiZWxzGAIgAygLMkcuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5TZXJ2aWNlVW5hdmFpbGFibGVFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4QEKGFRpbWVvdXRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJUCgZsYWJlbHMYAiADKAsyPC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlRpbWVvdXRFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGUludGVybmFsRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLhAQoYTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElQKBmxhYmVscxgCIAMoCzI8LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLpAQocSW50ZXJuYWxTZGtFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJYCgZsYWJlbHMYAiADKAsyQC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkludGVybmFsU2RrRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuEBChhVbmtub3duRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVAoGbGFiZWxzGAIgAygLMjwuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Vbmtub3duRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIsUBCghPcHNFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkEhcKB2dvYWxfaWQYBSABKAlSBmdvYWxJZBIXCgd1c2VyX2lkGAYgASgJUgZ1c2VySWQiXAoNVXNlckdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFAoFdmFsdWUYAyABKAFSBXZhbHVlKnAKCFNvdXJjZUlkEgsKB1VOS05PV04QABILCgdBTkRST0lEEAESBwoDSU9TEAISCwoDV0VCEAMaAggBEg0KCUdPX1NFUlZFUhAFEg8KC05PREVfU0VSVkVSEAYSDgoKSkFWQVNDUklQVBAHIgQIBBAEKpsBCgVBcGlJZBIPCgtVTktOT1dOX0FQSRAAEhIKDkdFVF9FVkFMVUFUSU9OEAESEwoPR0VUX0VWQUxVQVRJT05TEAISEwoPUkVHSVNURVJfRVZFTlRTEAMSFQoRR0VUX0ZFQVRVUkVfRkxBR1MQBBIVChFHRVRfU0VHTUVOVF9VU0VSUxAFEhUKEVNES19HRVRfVkFSSUFUSU9OEGRCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2NsaWVudGIGcHJvdG8zCrcGCiJwcm90by9jb2RlcmVmL2NvZGVfcmVmZXJlbmNlLnByb3RvEhFidWNrZXRlZXIuY29kZXJlZiLCBQoNQ29kZVJlZmVyZW5jZRIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEhsKCWZpbGVfcGF0aBgDIAEoCVIIZmlsZVBhdGgSHwoLbGluZV9udW1iZXIYBCABKAVSCmxpbmVOdW1iZXISIQoMY29kZV9zbmlwcGV0GAUgASgJUgtjb2RlU25pcHBldBIhCgxjb250ZW50X2hhc2gYBiABKAlSC2NvbnRlbnRIYXNoEhgKB2FsaWFzZXMYByADKAlSB2FsaWFzZXMSJwoPcmVwb3NpdG9yeV9uYW1lGAggASgJUg5yZXBvc2l0b3J5TmFtZRIpChByZXBvc2l0b3J5X293bmVyGAkgASgJUg9yZXBvc2l0b3J5T3duZXISWAoPcmVwb3NpdG9yeV90eXBlGAogASgOMi8uYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZS5SZXBvc2l0b3J5VHlwZVIOcmVwb3NpdG9yeVR5cGUSKwoRcmVwb3NpdG9yeV9icmFuY2gYCyABKAlSEHJlcG9zaXRvcnlCcmFuY2gSHwoLY29tbWl0X2hhc2gYDCABKAlSCmNvbW1pdEhhc2gSJQoOZW52aXJvbm1lbnRfaWQYDSABKAlSDWVudmlyb25tZW50SWQSHQoKY3JlYXRlZF9hdBgOIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYDyABKANSCXVwZGF0ZWRBdBIdCgpzb3VyY2VfdXJsGBAgASgJUglzb3VyY2VVcmwiZAoOUmVwb3NpdG9yeVR5cGUSHwobUkVQT1NJVE9SWV9UWVBFX1VOU1BFQ0lGSUVEEAASCgoGR0lUSFVCEAESCgoGR0lUTEFCEAISDQoJQklUQlVDS0VUEAMSCgoGQ1VTVE9NEARCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2NvZGVyZWZiBnByb3RvMwqxMgobcHJvdG8vY29kZXJlZi9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuY29kZXJlZhoicHJvdG8vY29kZXJlZi9jb2RlX3JlZmVyZW5jZS5wcm90bxocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90byJQChdHZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiYwoYR2V0Q29kZVJlZmVyZW5jZVJlc3BvbnNlEkcKDmNvZGVfcmVmZXJlbmNlGAEgASgLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVINY29kZVJlZmVyZW5jZSKsBQoZTGlzdENvZGVSZWZlcmVuY2VzUmVxdWVzdBIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPcmVwb3NpdG9yeV9uYW1lGAMgASgJUg5yZXBvc2l0b3J5TmFtZRIpChByZXBvc2l0b3J5X293bmVyGAQgASgJUg9yZXBvc2l0b3J5T3duZXISWAoPcmVwb3NpdG9yeV90eXBlGAUgASgOMi8uYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZS5SZXBvc2l0b3J5VHlwZVIOcmVwb3NpdG9yeVR5cGUSKwoRcmVwb3NpdG9yeV9icmFuY2gYBiABKAlSEHJlcG9zaXRvcnlCcmFuY2gSFgoGY3Vyc29yGAcgASgJUgZjdXJzb3ISGwoJcGFnZV9zaXplGAggASgDUghwYWdlU2l6ZRJPCghvcmRlcl9ieRgJIAEoDjI0LmJ1Y2tldGVlci5jb2RlcmVmLkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJkCg9vcmRlcl9kaXJlY3Rpb24YCiABKA4yOy5idWNrZXRlZXIuY29kZXJlZi5MaXN0Q29kZVJlZmVyZW5jZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5maWxlX2V4dGVuc2lvbhgLIAEoCVINZmlsZUV4dGVuc2lvbiI2CgdPcmRlckJ5EgsKB0RFRkFVTFQQABIOCgpDUkVBVEVEX0FUEAESDgoKVVBEQVRFRF9BVBACIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQASKgAQoaTGlzdENvZGVSZWZlcmVuY2VzUmVzcG9uc2USSQoPY29kZV9yZWZlcmVuY2VzGAEgAygLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVIOY29kZVJlZmVyZW5jZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi/AMKGkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoImYKG0NyZWF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2Ui7QMKGlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoImYKG1VwZGF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2UiUwoaRGVsZXRlQ29kZVJlZmVyZW5jZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkIh0KG0RlbGV0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZTKVHgoUQ29kZVJlZmVyZW5jZVNlcnZpY2US9wUKEEdldENvZGVSZWZlcmVuY2USKi5idWNrZXRlZXIuY29kZXJlZi5HZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBorLmJ1Y2tldGVlci5jb2RlcmVmLkdldENvZGVSZWZlcmVuY2VSZXNwb25zZSKJBZJB5QQKDkNvZGUgUmVmZXJlbmNlEgNHZXQaG0dldCBhIGNvZGUgcmVmZXJlbmNlIGJ5IElELioZd2ViLnYxLmNvZGVfcmVmZXJlbmNlLmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIaEhgvdjEvY29kZV9yZWZlcmVuY2VzL3tpZH0S4AQKEkxpc3RDb2RlUmVmZXJlbmNlcxIsLmJ1Y2tldGVlci5jb2RlcmVmLkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QaLS5idWNrZXRlZXIuY29kZXJlZi5MaXN0Q29kZVJlZmVyZW5jZXNSZXNwb25zZSLsA5JBzQMKDkNvZGUgUmVmZXJlbmNlEgRMaXN0Gi1MaXN0IGNvZGUgcmVmZXJlbmNlcyB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZy4qGndlYi52MS5jb2RlX3JlZmVyZW5jZS5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCFRITL3YxL2NvZGVfcmVmZXJlbmNlcxKwBgoTQ3JlYXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5jb2RlcmVmLkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmNvZGVyZWYuQ3JlYXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIrkFkkGXBQoOQ29kZSBSZWZlcmVuY2USBkNyZWF0ZRpHQ3JlYXRlIGEgbmV3IGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgcm9sZS4qHHdlYi52MS5jb2RlX3JlZmVyZW5jZS5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCGCITL3YxL2NvZGVfcmVmZXJlbmNlczoBKhK7BgoTVXBkYXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5jb2RlcmVmLlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmNvZGVyZWYuVXBkYXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIsQFkkGdBQoOQ29kZSBSZWZlcmVuY2USBlVwZGF0ZRpNVXBkYXRlIGFuIGV4aXN0aW5nIGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgcm9sZS4qHHdlYi52MS5jb2RlX3JlZmVyZW5jZS51cGRhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHTIYL3YxL2NvZGVfcmVmZXJlbmNlcy97aWR9OgEqEq4GChNEZWxldGVDb2RlUmVmZXJlbmNlEi0uYnVja2V0ZWVyLmNvZGVyZWYuRGVsZXRlQ29kZVJlZmVyZW5jZVJlcXVlc3QaLi5idWNrZXRlZXIuY29kZXJlZi5EZWxldGVDb2RlUmVmZXJlbmNlUmVzcG9uc2UitwWSQZMFCg5Db2RlIFJlZmVyZW5jZRIGRGVsZXRlGkNEZWxldGUgYSBjb2RlIHJlZmVyZW5jZS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgV1JJVEVgIHJvbGUuKhx3ZWIudjEuY29kZV9yZWZlcmVuY2UuZGVsZXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhoqGC92MS9jb2RlX3JlZmVyZW5jZXMve2lkfUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vY29kZXJlZmIGcHJvdG8zCvydAQobcHJvdG8vZ2F0ZXdheS9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuZ2F0ZXdheRocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhVwcm90by91c2VyL3VzZXIucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvGhtwcm90by9mZWF0dXJlL3NlcnZpY2UucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGhpwcm90by9mZWF0dXJlL3RhcmdldC5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGhVwcm90by9wdXNoL3B1c2gucHJvdG8aGHByb3RvL3B1c2gvc2VydmljZS5wcm90bxobcHJvdG8vYWNjb3VudC9zZXJ2aWNlLnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aHnByb3RvL2V2ZW50L2NsaWVudC9ldmVudC5wcm90bxoicHJvdG8vY29kZXJlZi9jb2RlX3JlZmVyZW5jZS5wcm90bxobcHJvdG8vY29kZXJlZi9zZXJ2aWNlLnByb3RvIg0KC1BpbmdSZXF1ZXN0IiIKDFBpbmdSZXNwb25zZRISCgR0aW1lGAEgASgDUgR0aW1lItcBChZHZXRGZWF0dXJlRmxhZ3NSZXF1ZXN0EhAKA3RhZxgBIAEoCVIDdGFnEigKEGZlYXR1cmVfZmxhZ3NfaWQYAiABKAlSDmZlYXR1cmVGbGFnc0lkEiEKDHJlcXVlc3RlZF9hdBgDIAEoA1ILcmVxdWVzdGVkQXQSPQoJc291cmNlX2lkGAQgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBSABKAlSCnNka1ZlcnNpb24i/AEKF0dldEZlYXR1cmVGbGFnc1Jlc3BvbnNlEigKEGZlYXR1cmVfZmxhZ3NfaWQYASABKAlSDmZlYXR1cmVGbGFnc0lkEjYKCGZlYXR1cmVzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMSOQoZYXJjaGl2ZWRfZmVhdHVyZV9mbGFnX2lkcxgDIAMoCVIWYXJjaGl2ZWRGZWF0dXJlRmxhZ0lkcxIhCgxyZXF1ZXN0ZWRfYXQYBCABKANSC3JlcXVlc3RlZEF0EiEKDGZvcmNlX3VwZGF0ZRgFIAEoCFILZm9yY2VVcGRhdGUivAEKFkdldFNlZ21lbnRVc2Vyc1JlcXVlc3QSHwoLc2VnbWVudF9pZHMYASADKAlSCnNlZ21lbnRJZHMSIQoMcmVxdWVzdGVkX2F0GAIgASgDUgtyZXF1ZXN0ZWRBdBI9Cglzb3VyY2VfaWQYAyABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgEIAEoCVIKc2RrVmVyc2lvbiLVAQoXR2V0U2VnbWVudFVzZXJzUmVzcG9uc2USRAoNc2VnbWVudF91c2VycxgBIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2Vyc1IMc2VnbWVudFVzZXJzEi4KE2RlbGV0ZWRfc2VnbWVudF9pZHMYAiADKAlSEWRlbGV0ZWRTZWdtZW50SWRzEiEKDHJlcXVlc3RlZF9hdBgDIAEoA1ILcmVxdWVzdGVkQXQSIQoMZm9yY2VfdXBkYXRlGAQgASgIUgtmb3JjZVVwZGF0ZSL6AwoVR2V0RXZhbHVhdGlvbnNSZXF1ZXN0EhAKA3RhZxgBIAEoCVIDdGFnEigKBHVzZXIYAiABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEi4KE3VzZXJfZXZhbHVhdGlvbnNfaWQYAyABKAlSEXVzZXJFdmFsdWF0aW9uc0lkEiEKCmZlYXR1cmVfaWQYBCABKAlCAhgBUglmZWF0dXJlSWQSPQoJc291cmNlX2lkGAUgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSfAoZdXNlcl9ldmFsdWF0aW9uX2NvbmRpdGlvbhgGIAEoCzJALmJ1Y2tldGVlci5nYXRld2F5LkdldEV2YWx1YXRpb25zUmVxdWVzdC5Vc2VyRXZhbHVhdGlvbkNvbmRpdGlvblIXdXNlckV2YWx1YXRpb25Db25kaXRpb24SHwoLc2RrX3ZlcnNpb24YByABKAlSCnNka1ZlcnNpb24adAoXVXNlckV2YWx1YXRpb25Db25kaXRpb24SIQoMZXZhbHVhdGVkX2F0GAEgASgDUgtldmFsdWF0ZWRBdBI2Chd1c2VyX2F0dHJpYnV0ZXNfdXBkYXRlZBgCIAEoCFIVdXNlckF0dHJpYnV0ZXNVcGRhdGVkIs4BChZHZXRFdmFsdWF0aW9uc1Jlc3BvbnNlEj4KBXN0YXRlGAEgASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuVXNlckV2YWx1YXRpb25zLlN0YXRlUgVzdGF0ZRJECgtldmFsdWF0aW9ucxgCIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlVzZXJFdmFsdWF0aW9uc1ILZXZhbHVhdGlvbnMSLgoTdXNlcl9ldmFsdWF0aW9uc19pZBgDIAEoCVIRdXNlckV2YWx1YXRpb25zSWQi0QEKFEdldEV2YWx1YXRpb25SZXF1ZXN0EhAKA3RhZxgBIAEoCVIDdGFnEigKBHVzZXIYAiABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEh0KCmZlYXR1cmVfaWQYAyABKAlSCWZlYXR1cmVJZBI9Cglzb3VyY2VfaWQYBCABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgFIAEoCVIKc2RrVmVyc2lvbiJWChVHZXRFdmFsdWF0aW9uUmVzcG9uc2USPQoKZXZhbHVhdGlvbhgBIAEoCzIdLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRpb25SCmV2YWx1YXRpb24irgEKFVJlZ2lzdGVyRXZlbnRzUmVxdWVzdBI1CgZldmVudHMYASADKAsyHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkV2ZW50UgZldmVudHMSHwoLc2RrX3ZlcnNpb24YAiABKAlSCnNka1ZlcnNpb24SPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQilAIKFlJlZ2lzdGVyRXZlbnRzUmVzcG9uc2USTQoGZXJyb3JzGAEgAygLMjUuYnVja2V0ZWVyLmdhdGV3YXkuUmVnaXN0ZXJFdmVudHNSZXNwb25zZS5FcnJvcnNFbnRyeVIGZXJyb3JzGj8KBUVycm9yEhwKCXJldHJpYWJsZRgBIAEoCFIJcmV0cmlhYmxlEhgKB21lc3NhZ2UYAiABKAlSB21lc3NhZ2UaagoLRXJyb3JzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSRQoFdmFsdWUYAiABKAsyLy5idWNrZXRlZXIuZ2F0ZXdheS5SZWdpc3RlckV2ZW50c1Jlc3BvbnNlLkVycm9yUgV2YWx1ZToCOAEinAEKDFRyYWNrUmVxdWVzdBIWCgZhcGlrZXkYASABKAlSBmFwaWtleRIWCgZ1c2VyaWQYAiABKAlSBnVzZXJpZBIWCgZnb2FsaWQYAyABKAlSBmdvYWxpZBIQCgN0YWcYBCABKAlSA3RhZxIcCgl0aW1lc3RhbXAYBSABKANSCXRpbWVzdGFtcBIUCgV2YWx1ZRgGIAEoAVIFdmFsdWUiDwoNVHJhY2tSZXNwb25zZSLdAgoUQ3JlYXRlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEk8KDnZhcmlhdGlvbl90eXBlGAQgASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlEjwKCnZhcmlhdGlvbnMYBSADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSEgoEdGFncxgGIAMoCVIEdGFncxIsChJvbl92YXJpYXRpb25faW5kZXgYByABKAVSEG9uVmFyaWF0aW9uSW5kZXgSLgoTb2ZmX3ZhcmlhdGlvbl9pbmRleBgIIAEoBVIRb2ZmVmFyaWF0aW9uSW5kZXgiTQoVQ3JlYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIiMKEUdldEZlYXR1cmVSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCJKChJHZXRGZWF0dXJlUmVzcG9uc2USNAoHZmVhdHVyZRgBIAEoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSB2ZlYXR1cmUi9QEKE0xpc3RGZWF0dXJlc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJJCghvcmRlcl9ieRgDIAEoDjIuLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJeCg9vcmRlcl9kaXJlY3Rpb24YBCABKA4yNS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbiJOChRMaXN0RmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzIqgFChRVcGRhdGVGZWF0dXJlUmVxdWVzdBIYCgdjb21tZW50GAEgASgJUgdjb21tZW50Eg4KAmlkGAIgASgJUgJpZBIwCgRuYW1lGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbhISCgR0YWdzGAUgAygJUgR0YWdzEjQKB2VuYWJsZWQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEjYKCGFyY2hpdmVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSPAoKdmFyaWF0aW9ucxgIIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxJFCg1wcmVyZXF1aXNpdGVzGAkgAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEjMKB3RhcmdldHMYCiADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMSLQoFcnVsZXMYCyADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxJGChBkZWZhdWx0X3N0cmF0ZWd5GAwgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSD2RlZmF1bHRTdHJhdGVneRJBCg1vZmZfdmFyaWF0aW9uGA0gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgxvZmZWYXJpYXRpb24iTQoVVXBkYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIpACChFMaXN0UHVzaGVzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEkQKCG9yZGVyX2J5GAMgASgOMikuYnVja2V0ZWVyLnB1c2guTGlzdFB1c2hlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJZCg9vcmRlcl9kaXJlY3Rpb24YBCABKA4yMC5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBSABKAlSDXNlYXJjaEtleXdvcmQiewoSTGlzdFB1c2hlc1Jlc3BvbnNlEiwKBnB1c2hlcxgBIAMoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBnB1c2hlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCJrChFDcmVhdGVQdXNoUmVxdWVzdBISCgR0YWdzGAEgAygJUgR0YWdzEhIKBG5hbWUYAiABKAlSBG5hbWUSLgoTZmNtX3NlcnZpY2VfYWNjb3VudBgDIAEoDFIRZmNtU2VydmljZUFjY291bnQiPgoSQ3JlYXRlUHVzaFJlc3BvbnNlEigKBHB1c2gYASABKAsyFC5idWNrZXRlZXIucHVzaC5QdXNoUgRwdXNoIiAKDkdldFB1c2hSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCI7Cg9HZXRQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2gigAIKEVVwZGF0ZVB1c2hSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBISCgR0YWdzGAIgAygJUgR0YWdzEjAKBG5hbWUYAyABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSBG5hbWUSlAEKB2RlbGV0ZWQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlQl6SQVsqB2RlbGV0ZWQyUGlmIHRydWUsIHRoZSBwdXNoIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGRlbGV0ZWQgYW5kIG90aGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQuUgdkZWxldGVkIj4KElVwZGF0ZVB1c2hSZXNwb25zZRIoCgRwdXNoGAEgASgLMhQuYnVja2V0ZWVyLnB1c2guUHVzaFIEcHVzaCKlAwoWQ3JlYXRlQWNjb3VudFYyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIdCgpmaXJzdF9uYW1lGAcgASgJUglmaXJzdE5hbWUSGwoJbGFzdF9uYW1lGAggASgJUghsYXN0TmFtZRIaCghsYW5ndWFnZRgJIAEoCVIIbGFuZ3VhZ2UiUQoXQ3JlYXRlQWNjb3VudFYyUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCKJCAoWVXBkYXRlQWNjb3VudFYyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZBIwCgRuYW1lGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEkYKEGF2YXRhcl9pbWFnZV91cmwYBCABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSDmF2YXRhckltYWdlVXJsEmwKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgLMj8uYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5Pcmdhbml6YXRpb25Sb2xlVmFsdWVSEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEjsKCmZpcnN0X25hbWUYByABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCWZpcnN0TmFtZRI5CglsYXN0X25hbWUYCCABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCGxhc3ROYW1lEjgKCGxhbmd1YWdlGAkgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUghsYW5ndWFnZRI4CglsYXN0X3NlZW4YCiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVIIbGFzdFNlZW4SUQoGYXZhdGFyGAsgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5BY2NvdW50VjJBdmF0YXJSBmF2YXRhchKgAQoIZGlzYWJsZWQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlQmiSQWUqCGRpc2FibGVkMllpZiBkaXNhYmxlZCBpcyB0cnVlLCB0aGUgYWNjb3VudCB3aWxsIGJlIGRpc2FibGVkLiBJZiBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSBlbmFibGVkLlIIZGlzYWJsZWQSigEKB2RlbGV0ZWQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlQlSSQVEqB2RlbGV0ZWQyRmlmIHRydWUsIHRoZSBhY2NvdW50IHdpbGwgYmUgZGVsZXRlZCBhbmQgb3RoZXIgZmllbGRzIHdpbGwgYmUgaWdub3JlZC5SB2RlbGV0ZWQiUQoXVXBkYXRlQWNjb3VudFYyUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCJUChNHZXRBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkIk4KFEdldEFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiYQoiR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiXQojR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCI3CgxHZXRNZVJlcXVlc3QSJwoPb3JnYW5pemF0aW9uX2lkGAEgASgJUg5vcmdhbml6YXRpb25JZCJMCg1HZXRNZVJlc3BvbnNlEjsKB2FjY291bnQYASABKAsyIS5idWNrZXRlZXIuYWNjb3VudC5Db25zb2xlQWNjb3VudFIHYWNjb3VudCLaBAoVTGlzdEFjY291bnRzVjJSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISJwoPb3JnYW5pemF0aW9uX2lkGAMgASgJUg5vcmdhbml6YXRpb25JZBJLCghvcmRlcl9ieRgEIAEoDjIwLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmAKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI3LmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZBJIChFvcmdhbml6YXRpb25fcm9sZRgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhBvcmdhbml6YXRpb25Sb2xlEkMKDmVudmlyb25tZW50X2lkGAkgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUg1lbnZpcm9ubWVudElkEkYKEGVudmlyb25tZW50X3JvbGUYCiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIPZW52aXJvbm1lbnRSb2xlIosBChZMaXN0QWNjb3VudHNWMlJlc3BvbnNlEjgKCGFjY291bnRzGAEgAygLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUghhY2NvdW50cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCIpChdHZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQiYwoYR2V0Q29kZVJlZmVyZW5jZVJlc3BvbnNlEkcKDmNvZGVfcmVmZXJlbmNlGAEgASgLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVINY29kZVJlZmVyZW5jZSLNAgoZTGlzdENvZGVSZWZlcmVuY2VzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEk8KCG9yZGVyX2J5GAMgASgOMjQuYnVja2V0ZWVyLmNvZGVyZWYuTGlzdENvZGVSZWZlcmVuY2VzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmQKD29yZGVyX2RpcmVjdGlvbhgEIAEoDjI7LmJ1Y2tldGVlci5jb2RlcmVmLkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkEh0KCmZlYXR1cmVfaWQYBiABKAlSCWZlYXR1cmVJZCKgAQoaTGlzdENvZGVSZWZlcmVuY2VzUmVzcG9uc2USSQoPY29kZV9yZWZlcmVuY2VzGAEgAygLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVIOY29kZVJlZmVyZW5jZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi/AMKGkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoImYKG0NyZWF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2UimAIKGlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBIbCglmaWxlX3BhdGgYAiABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAMgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgEIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAUgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAYgAygJUgdhbGlhc2VzEisKEXJlcG9zaXRvcnlfYnJhbmNoGAcgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAggASgJUgpjb21taXRIYXNoImYKG1VwZGF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2UiLAoaRGVsZXRlQ29kZVJlZmVyZW5jZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkIh0KG0RlbGV0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZTKZRgoHR2F0ZXdheRL0AgoOR2V0RXZhbHVhdGlvbnMSKC5idWNrZXRlZXIuZ2F0ZXdheS5HZXRFdmFsdWF0aW9uc1JlcXVlc3QaKS5idWNrZXRlZXIuZ2F0ZXdheS5HZXRFdmFsdWF0aW9uc1Jlc3BvbnNlIowCkkHtAQoWQ2xpZW50IGFuZCBTZXJ2ZXIgU0RLcxIPR2V0IEV2YWx1YXRpb25zGmFHZXRzIGFsbCB0aGUgZXZhbHVhdGlvbnMgZm9yIGEgc3BlY2lmaWMgdXNlci4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgQ0xJRU5UYCBBUEkgS2V5IHJvbGUuKhthcGkuZ2F0ZXdheS5nZXRfZXZhbHVhdGlvbnNyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCFSIQL2dldF9ldmFsdWF0aW9uczoBKhLuAgoNR2V0RXZhbHVhdGlvbhInLmJ1Y2tldGVlci5nYXRld2F5LkdldEV2YWx1YXRpb25SZXF1ZXN0GiguYnVja2V0ZWVyLmdhdGV3YXkuR2V0RXZhbHVhdGlvblJlc3BvbnNlIokCkkHrAQoWQ2xpZW50IGFuZCBTZXJ2ZXIgU0RLcxIOR2V0IEV2YWx1YXRpb24aYUdldHMgYSBzaW5nbGUgZXZhbHVhdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBDTElFTlRgIEFQSSBLZXkgcm9sZS4qGmFwaS5nYXRld2F5LmdldF9ldmFsdWF0aW9uckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhQiDy9nZXRfZXZhbHVhdGlvbjoBKhL6AgoPR2V0RmVhdHVyZUZsYWdzEikuYnVja2V0ZWVyLmdhdGV3YXkuR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBoqLmJ1Y2tldGVlci5nYXRld2F5LkdldEZlYXR1cmVGbGFnc1Jlc3BvbnNlIo8CkkHuAQoWQ2xpZW50IGFuZCBTZXJ2ZXIgU0RLcxIRR2V0IEZlYXR1cmUgRmxhZ3MaXkdldHMgYWxsIHRoZSBmZWF0dXJlIGZsYWcgaW4gYW4gZW52aXJvbm1lbnQuIFRvIGNhbGwgdGhpcyBBUEksIGl0IG5lZWRzIGBTRVJWRVJgIEFQSSBLZXkgcm9sZS4qHWFwaS5nYXRld2F5LmdldF9mZWF0dXJlX2ZsYWdzckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhciEi9nZXRfZmVhdHVyZV9mbGFnczoBKhL7AgoPR2V0U2VnbWVudFVzZXJzEikuYnVja2V0ZWVyLmdhdGV3YXkuR2V0U2VnbWVudFVzZXJzUmVxdWVzdBoqLmJ1Y2tldGVlci5nYXRld2F5LkdldFNlZ21lbnRVc2Vyc1Jlc3BvbnNlIpACkkHvAQoWQ2xpZW50IGFuZCBTZXJ2ZXIgU0RLcxIRR2V0IFNlZ21lbnQgVXNlcnMaX0dldHMgYWxsIHRoZSBzZWdtZW50IHVzZXJzIGluIGFuIGVudmlyb25tZW50LiBUbyBjYWxsIHRoaXMgQVBJLCBpdCBuZWVkcyBgU0VSVkVSYCBBUEkgS2V5IHJvbGUuKh1hcGkuZ2F0ZXdheS5nZXRfc2VnbWVudF91c2Vyc3JCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIXIhIvZ2V0X3NlZ21lbnRfdXNlcnM6ASoS+QIKDlJlZ2lzdGVyRXZlbnRzEiguYnVja2V0ZWVyLmdhdGV3YXkuUmVnaXN0ZXJFdmVudHNSZXF1ZXN0GikuYnVja2V0ZWVyLmdhdGV3YXkuUmVnaXN0ZXJFdmVudHNSZXNwb25zZSKRApJB8gEKFkNsaWVudCBhbmQgU2VydmVyIFNES3MSD1JlZ2lzdGVyIEV2ZW50cxpmVGhpcyBBUEkgaXMgZm9yIHJlcG9ydGluZyBHb2FsIGV2ZW50cy4gVG8gY2FsbCB0aGlzIEFQSSwgaXQgbmVlZHMgYSBgQ0xJRU5UYCBvciBgU0VSVkVSYCBBUEkgS2V5IHJvbGUuKhthcGkuZ2F0ZXdheS5yZWdpc3Rlcl9ldmVudHNyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCFSIQL3JlZ2lzdGVyX2V2ZW50czoBKhKPAgoFVHJhY2sSHy5idWNrZXRlZXIuZ2F0ZXdheS5UcmFja1JlcXVlc3QaIC5idWNrZXRlZXIuZ2F0ZXdheS5UcmFja1Jlc3BvbnNlIsIBkkGwAQoWQ2xpZW50IGFuZCBTZXJ2ZXIgU0RLcxIFVHJhY2safFRoaXMgQVBJIGlzIGFuIGludGVncmF0aW9uIGZvciBHb29nbGUgVGFiIE1hbmFnZXIgdG8gcmVwb3J0IEdvYWwgZXZlbnRzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBDTElFTlRgIEFQSSBLZXkgcm9sZS4qEWFwaS5nYXRld2F5LnRyYWNrgtPkkwIIEgYvdHJhY2sS1QIKDUNyZWF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5nYXRld2F5LkNyZWF0ZUZlYXR1cmVSZXNwb25zZSLwAZJB1QEKDUZlYXR1cmUgRmxhZ3MSBkNyZWF0ZRpYQ3JlYXRlIGEgbmV3IEZlYXR1cmUgRmxhZy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgV1JJVEVgIG9yIGBBRE1JTmAgQVBJIEtleSByb2xlLioeYXBpLmdhdGV3YXkudjEuZmVhdHVyZXMuY3JlYXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhEiDC92MS9mZWF0dXJlczoBKhK1AgoKR2V0RmVhdHVyZRIkLmJ1Y2tldGVlci5nYXRld2F5LkdldEZlYXR1cmVSZXF1ZXN0GiUuYnVja2V0ZWVyLmdhdGV3YXkuR2V0RmVhdHVyZVJlc3BvbnNlItkBkkG8AQoNRmVhdHVyZSBGbGFncxIDR2V0GkVHZXQgYSBGZWF0dXJlIEZsYWcuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFJFQURgIEFQSSBLZXkgcm9sZS4qG2FwaS5nYXRld2F5LnYxLmZlYXR1cmVzLmdldHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwITEhEvdjEvZmVhdHVyZXMve2lkfRK4AgoMTGlzdEZlYXR1cmVzEiYuYnVja2V0ZWVyLmdhdGV3YXkuTGlzdEZlYXR1cmVzUmVxdWVzdBonLmJ1Y2tldGVlci5nYXRld2F5Lkxpc3RGZWF0dXJlc1Jlc3BvbnNlItYBkkG+AQoNRmVhdHVyZSBGbGFncxIETGlzdBpFTGlzdCBGZWF0dXJlIEZsYWdzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhxhcGkuZ2F0ZXdheS52MS5mZWF0dXJlcy5saXN0ckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAg4SDC92MS9mZWF0dXJlcxLWAgoNVXBkYXRlRmVhdHVyZRInLmJ1Y2tldGVlci5nYXRld2F5LlVwZGF0ZUZlYXR1cmVSZXF1ZXN0GiguYnVja2V0ZWVyLmdhdGV3YXkuVXBkYXRlRmVhdHVyZVJlc3BvbnNlIvEBkkHRAQoNRmVhdHVyZSBGbGFncxIGVXBkYXRlGlRVcGRhdGUgYSBGZWF0dXJlIEZsYWcuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHmFwaS5nYXRld2F5LnYxLmZlYXR1cmVzLnVwZGF0ZXJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIWMhEvdjEvZmVhdHVyZXMve2lkfToBKhLuAQoEUGluZxIeLmJ1Y2tldGVlci5nYXRld2F5LlBpbmdSZXF1ZXN0Gh8uYnVja2V0ZWVyLmdhdGV3YXkuUGluZ1Jlc3BvbnNlIqQBkkGTAQoHVXRpbGl0eRIEUGluZxoqUGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGl0cyBhdmFpbGFiaWxpdHkuKhBhcGkuZ2F0ZXdheS5waW5nYgByQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCBxIFL3BpbmcSoAIKCkxpc3RQdXNoZXMSJC5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0UHVzaGVzUmVxdWVzdBolLmJ1Y2tldGVlci5nYXRld2F5Lkxpc3RQdXNoZXNSZXNwb25zZSLEAZJBrgEKBlB1c2hlcxIETGlzdBo+TGlzdCBwdXNoZXMuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFJFQURgIEFQSSBLZXkgcm9sZS4qGmFwaS5nYXRld2F5LnYxLnB1c2hlcy5saXN0ckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAgwSCi92MS9wdXNoZXMS8wIKCkNyZWF0ZVB1c2gSJC5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVQdXNoUmVxdWVzdBolLmJ1Y2tldGVlci5nYXRld2F5LkNyZWF0ZVB1c2hSZXNwb25zZSKXApJBgAIKBlB1c2hlcxIGQ3JlYXRlGosBQ3JlYXRlIGEgbmV3IFB1c2ggbm90aWZpY2F0aW9uIHRocm91Z2ggR29vZ2xlIEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyAoRkNNKS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgV1JJVEVgIG9yIGBBRE1JTmAgQVBJIEtleSByb2xlLiocYXBpLmdhdGV3YXkudjEucHVzaGVzLmNyZWF0ZXJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwINIggvdjEvcHVzaDoBKhKkAgoHR2V0UHVzaBIhLmJ1Y2tldGVlci5nYXRld2F5LkdldFB1c2hSZXF1ZXN0GiIuYnVja2V0ZWVyLmdhdGV3YXkuR2V0UHVzaFJlc3BvbnNlItEBkkG4AQoGUHVzaGVzEgNHZXQaSkdldCBhIFB1c2ggbm90aWZpY2F0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhlhcGkuZ2F0ZXdheS52MS5wdXNoZXMuZ2V0ckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAg8SDS92MS9wdXNoL3tpZH0SwAIKClVwZGF0ZVB1c2gSJC5idWNrZXRlZXIuZ2F0ZXdheS5VcGRhdGVQdXNoUmVxdWVzdBolLmJ1Y2tldGVlci5nYXRld2F5LlVwZGF0ZVB1c2hSZXNwb25zZSLkAZJByAEKBlB1c2hlcxIGVXBkYXRlGlRVcGRhdGUgYSBQdXNoIG5vdGlmaWNhdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHGFwaS5nYXRld2F5LnYxLnB1c2hlcy51cGRhdGVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCEjINL3YxL3B1c2gve2lkfToBKhLOAgoPQ3JlYXRlQWNjb3VudFYyEikuYnVja2V0ZWVyLmdhdGV3YXkuQ3JlYXRlQWNjb3VudFYyUmVxdWVzdBoqLmJ1Y2tldGVlci5nYXRld2F5LkNyZWF0ZUFjY291bnRWMlJlc3BvbnNlIuMBkkHJAQoHQWNjb3VudBIGQ3JlYXRlGlNDcmVhdGUgYSBuZXcgQWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgV1JJVEVgIG9yIGBBRE1JTmAgQVBJIEtleSByb2xlLiodYXBpLmdhdGV3YXkudjEuYWNjb3VudC5jcmVhdGVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCECILL3YxL2FjY291bnQ6ASoS5QIKD1VwZGF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5nYXRld2F5LlVwZGF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuZ2F0ZXdheS5VcGRhdGVBY2NvdW50VjJSZXNwb25zZSL6AZJBxgEKB0FjY291bnQSBlVwZGF0ZRpQVXBkYXRlIGFuIEFjY291bnQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qHWFwaS5nYXRld2F5LnYxLmFjY291bnQudXBkYXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAioyJS92MS9hY2NvdW50L3tvcmdhbml6YXRpb25faWR9L3tlbWFpbH06ASoS1wIKDEdldEFjY291bnRWMhImLmJ1Y2tldGVlci5nYXRld2F5LkdldEFjY291bnRWMlJlcXVlc3QaJy5idWNrZXRlZXIuZ2F0ZXdheS5HZXRBY2NvdW50VjJSZXNwb25zZSL1AZJBxAEKB0FjY291bnQSFkdldCBieSBPcmdhbml6YXRpb24gSUQaQUdldCBhbiBBY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKhphcGkuZ2F0ZXdheS52MS5hY2NvdW50LmdldHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwInEiUvdjEvYWNjb3VudC97b3JnYW5pemF0aW9uX2lkfS97ZW1haWx9EsEDChtHZXRBY2NvdW50VjJCeUVudmlyb25tZW50SUQSNS5idWNrZXRlZXIuZ2F0ZXdheS5HZXRBY2NvdW50VjJCeUVudmlyb25tZW50SURSZXF1ZXN0GjYuYnVja2V0ZWVyLmdhdGV3YXkuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2UisgKSQecBCgdBY2NvdW50EhVHZXQgYnkgRW52aXJvbm1lbnQgSUQaU0dldCBhbiBBY2NvdW50IGJ5IEVudmlyb25tZW50IElELiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKixhcGkuZ2F0ZXdheS52MS5hY2NvdW50LmdldF9ieV9lbnZpcm9ubWVudF9pZHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwJBEj8vdjEvYWNjb3VudC9nZXQtYWNjb3VudC1ieS1lbnZpcm9ubWVudC97ZW52aXJvbm1lbnRfaWR9L3tlbWFpbH0SxgIKBUdldE1lEh8uYnVja2V0ZWVyLmdhdGV3YXkuR2V0TWVSZXF1ZXN0GiAuYnVja2V0ZWVyLmdhdGV3YXkuR2V0TWVSZXNwb25zZSL5AZJBzQEKB0FjY291bnQSE0dldCBTZXJ2aWNlIEFjY291bnQaSkdldCB0aGUgY3VycmVudCBBY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBSRUFEYCBBUEkgS2V5IHJvbGUuKh1hcGkuZ2F0ZXdheS52MS5hY2NvdW50LmdldF9tZXJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIiEiAvdjEvYWNjb3VudC9tZS97b3JnYW5pemF0aW9uX2lkfRK2AgoOTGlzdEFjY291bnRzVjISKC5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0QWNjb3VudHNWMlJlcXVlc3QaKS5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0QWNjb3VudHNWMlJlc3BvbnNlIs4BkkG2AQoHQWNjb3VudBIETGlzdBpER2V0IGxpc3QgQWNjb3VudHMuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFJFQURgIEFQSSBLZXkgcm9sZS4qG2FwaS5nYXRld2F5LnYxLmFjY291bnQubGlzdHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIOEgwvdjEvYWNjb3VudHMS2QIKEEdldENvZGVSZWZlcmVuY2USKi5idWNrZXRlZXIuZ2F0ZXdheS5HZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBorLmJ1Y2tldGVlci5nYXRld2F5LkdldENvZGVSZWZlcmVuY2VSZXNwb25zZSLrAZJBxwEKD0NvZGUgUmVmZXJlbmNlcxIDR2V0GkdHZXQgYSBjb2RlIHJlZmVyZW5jZS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgUkVBRGAgQVBJIEtleSByb2xlLioiYXBpLmdhdGV3YXkudjEuY29kZV9yZWZlcmVuY2VzLmdldHJCCkAKDWF1dGhvcml6YXRpb24SK1RoZSBBUEkgS2V5IGdlbmVyYXRlZCBvbiB0aGUgQWRtaW4gQ29uc29sZS4YASgBgtPkkwIaEhgvdjEvY29kZV9yZWZlcmVuY2VzL3tpZH0S3AIKEkxpc3RDb2RlUmVmZXJlbmNlcxIsLmJ1Y2tldGVlci5nYXRld2F5Lkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QaLS5idWNrZXRlZXIuZ2F0ZXdheS5MaXN0Q29kZVJlZmVyZW5jZXNSZXNwb25zZSLoAZJByQEKD0NvZGUgUmVmZXJlbmNlcxIETGlzdBpHTGlzdCBjb2RlIHJlZmVyZW5jZXMuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFJFQURgIEFQSSBLZXkgcm9sZS4qI2FwaS5nYXRld2F5LnYxLmNvZGVfcmVmZXJlbmNlcy5saXN0ckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhUSEy92MS9jb2RlX3JlZmVyZW5jZXMS+QIKE0NyZWF0ZUNvZGVSZWZlcmVuY2USLS5idWNrZXRlZXIuZ2F0ZXdheS5DcmVhdGVDb2RlUmVmZXJlbmNlUmVxdWVzdBouLmJ1Y2tldGVlci5nYXRld2F5LkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZSKCApJB4AEKD0NvZGUgUmVmZXJlbmNlcxIGQ3JlYXRlGlpDcmVhdGUgYSBuZXcgY29kZSByZWZlcmVuY2UuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGEgYFdSSVRFYCBvciBgQURNSU5gIEFQSSBLZXkgcm9sZS4qJWFwaS5nYXRld2F5LnYxLmNvZGVfcmVmZXJlbmNlcy5jcmVhdGVyQgpACg1hdXRob3JpemF0aW9uEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGAEoAYLT5JMCGCITL3YxL2NvZGVfcmVmZXJlbmNlczoBKhL6AgoTVXBkYXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5nYXRld2F5LlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmdhdGV3YXkuVXBkYXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIoMCkkHcAQoPQ29kZSBSZWZlcmVuY2VzEgZVcGRhdGUaVlVwZGF0ZSBhIGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgb3IgYEFETUlOYCBBUEkgS2V5IHJvbGUuKiVhcGkuZ2F0ZXdheS52MS5jb2RlX3JlZmVyZW5jZXMudXBkYXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAh0yGC92MS9jb2RlX3JlZmVyZW5jZXMve2lkfToBKhL3AgoTRGVsZXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5nYXRld2F5LkRlbGV0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmdhdGV3YXkuRGVsZXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIoACkkHcAQoPQ29kZSBSZWZlcmVuY2VzEgZEZWxldGUaVkRlbGV0ZSBhIGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgb3IgYEFETUlOYCBBUEkgS2V5IHJvbGUuKiVhcGkuZ2F0ZXdheS52MS5jb2RlX3JlZmVyZW5jZXMuZGVsZXRlckIKQAoNYXV0aG9yaXphdGlvbhIrVGhlIEFQSSBLZXkgZ2VuZXJhdGVkIG9uIHRoZSBBZG1pbiBDb25zb2xlLhgBKAGC0+STAhoqGC92MS9jb2RlX3JlZmVyZW5jZXMve2lkfUKEBlovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2dhdGV3YXmSQc8FEiAKGUJ1Y2tldGVlciBHYXRld2F5IFNlcnZpY2UyAzEuMBoIRU5EUE9JTlQqAQIyEGFwcGxpY2F0aW9uL2pzb246EGFwcGxpY2F0aW9uL2pzb25StAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1SsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9UqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfVpQCk4KCkFwaUtleUF1dGgSQAgCEitUaGUgQVBJIEtleSBnZW5lcmF0ZWQgb24gdGhlIEFkbWluIENvbnNvbGUuGg1hdXRob3JpemF0aW9uIAJiEAoOCgpBcGlLZXlBdXRoEgBiBnByb3RvMw==
config:
port: 9000
adminPort: 8001
diff --git a/manifests/bucketeer/charts/batch/values.dev.yaml b/manifests/bucketeer/charts/batch/values.dev.yaml
index cb070a0e2a..effde34416 100644
--- a/manifests/bucketeer/charts/batch/values.dev.yaml
+++ b/manifests/bucketeer/charts/batch/values.dev.yaml
@@ -103,6 +103,9 @@ cronjob:
- name: mau-partition-creator
jobId: MauPartitionCreator
schedule: "0 2 2 * *"
+ - name: tag-deleter
+ jobId: TagDeleter
+ schedule: "* * * * *"
subscribers:
# This is the processor's name. It must match the same name defined in the
diff --git a/manifests/bucketeer/charts/batch/values.yaml b/manifests/bucketeer/charts/batch/values.yaml
index 95a6dd5bb5..b35b21749f 100644
--- a/manifests/bucketeer/charts/batch/values.yaml
+++ b/manifests/bucketeer/charts/batch/values.yaml
@@ -185,3 +185,6 @@ cronjob:
- name: auto-ops-rules-cacher
jobId: AutoOpsRulesCacher
schedule: "* * * * *"
+ - name: tag-deleter
+ jobId: TagDeleter
+ schedule: "0 0 * * *"
diff --git a/manifests/bucketeer/charts/web/templates/deployment.yaml b/manifests/bucketeer/charts/web/templates/deployment.yaml
index 6e1b6e9d1b..5cd308659e 100644
--- a/manifests/bucketeer/charts/web/templates/deployment.yaml
+++ b/manifests/bucketeer/charts/web/templates/deployment.yaml
@@ -86,6 +86,9 @@ spec:
- name: envoy-batch-descriptor-secret
secret:
secretName: {{ template "web.fullname" . }}-batch
+ - name: envoy-code-reference-descriptor-secret
+ secret:
+ secretName: {{ template "web.fullname" . }}-code-reference
{{- if .Values.serviceAccount.annotations }}
serviceAccountName: {{ template "web.fullname" . }}
{{- end }}
@@ -171,6 +174,8 @@ spec:
value: "{{ .Values.env.webConsoleServicePort }}"
- name: BUCKETEER_WEB_DASHBOARD_SERVICE_PORT
value: "{{ .Values.env.dashboardServicePort }}"
+ - name: BUCKETEER_WEB_CODE_REFERENCE_SERVICE_PORT
+ value: "{{ .Values.env.coderefServicePort }}"
- name: BUCKETEER_WEB_ACCOUNT_SERVICE
value: "{{ .Values.env.accountService }}"
- name: BUCKETEER_WEB_AUTH_SERVICE
@@ -185,6 +190,8 @@ spec:
value: "{{ .Values.env.featureService }}"
- name: BUCKETEER_WEB_AUTO_OPS_SERVICE
value: "{{ .Values.env.autoOpsService }}"
+ - name: BUCKETEER_WEB_CODE_REFERENCE_SERVICE
+ value: "{{ .Values.env.coderefService }}"
- name: BUCKETEER_WEB_TIMEZONE
value: "{{ .Values.env.timezone }}"
- name: BUCKETEER_WEB_METRICS_PORT
@@ -315,6 +322,9 @@ spec:
- name: envoy-batch-descriptor-secret
mountPath: /usr/local/batch-secret
readOnly: true
+ - name: envoy-code-reference-descriptor-secret
+ mountPath: /usr/local/code-reference-secret
+ readOnly: true
- name: service-cert-secret
mountPath: /usr/local/certs/service
readOnly: true
diff --git a/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml
index ca351a1cbe..dec85c2682 100644
--- a/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml
+++ b/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml
@@ -403,6 +403,38 @@ data:
explicit_http_config:
http2_protocol_options: {}
ignore_health_on_host_removal: true
+ - name: coderef
+ type: strict_dns
+ connect_timeout: 5s
+ dns_lookup_family: V4_ONLY
+ lb_policy: {{ .Values.envoy.lbPolicy }}
+ load_assignment:
+ cluster_name: coderef
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: localhost
+ port_value: 9105
+ transport_socket:
+ name: envoy.transport_sockets.tls
+ typed_config:
+ '@type': type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
+ common_tls_context:
+ alpn_protocols:
+ - h2
+ tls_certificates:
+ - certificate_chain:
+ filename: /usr/local/certs/service/tls.crt
+ private_key:
+ filename: /usr/local/certs/service/tls.key
+ typed_extension_protocol_options:
+ envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
+ '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
+ explicit_http_config:
+ http2_protocol_options: {}
+ ignore_health_on_host_removal: true
- name: web_console
type: strict_dns
connect_timeout: 5s
@@ -647,6 +679,14 @@ data:
retry_policy:
retry_on: 5xx
num_retries: 3
+ - match:
+ prefix: /bucketeer.coderef.CodeReferenceService
+ route:
+ cluster: coderef
+ timeout: 15s
+ retry_policy:
+ retry_on: 5xx
+ num_retries: 3
- match:
prefix: /
headers:
@@ -811,6 +851,15 @@ data:
- bucketeer.batch.BatchService
print_options:
always_print_primitive_fields: true
+ - name: envoy.filters.http.grpc_json_transcoder
+ typed_config:
+ "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
+ auto_mapping: true
+ proto_descriptor: /usr/local/code-reference-secret/code_reference_proto_descriptor.pb
+ services:
+ - bucketeer.coderef.CodeReferenceService
+ print_options:
+ always_print_primitive_fields: true
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
@@ -940,6 +989,14 @@ data:
retry_policy:
retry_on: 5xx
num_retries: 3
+ - match:
+ prefix: /bucketeer.coderef.CodeReferenceService
+ route:
+ cluster: coderef
+ timeout: 15s
+ retry_policy:
+ retry_on: 5xx
+ num_retries: 3
- match:
prefix: /v3
route:
@@ -1091,6 +1148,14 @@ data:
num_retries: 3
retry_on: 5xx
timeout: 15s
+ - match:
+ prefix: /bucketeer.coderef.CodeReferenceService
+ route:
+ cluster: coderef
+ timeout: 15s
+ retry_policy:
+ num_retries: 3
+ retry_on: 5xx
stat_prefix: egress_http
stream_idle_timeout: 300s
transport_socket:
diff --git a/manifests/bucketeer/charts/web/templates/secret.yaml b/manifests/bucketeer/charts/web/templates/secret.yaml
index 265020cb31..8ed938d9eb 100644
--- a/manifests/bucketeer/charts/web/templates/secret.yaml
+++ b/manifests/bucketeer/charts/web/templates/secret.yaml
@@ -157,6 +157,19 @@ data:
---
apiVersion: v1
kind: Secret
+metadata:
+ name: {{ template "web.fullname" . }}-code-reference
+ labels:
+ app: {{ template "web.name" . }}
+ chart: {{ template "web.chart" . }}
+ release: {{ template "web.fullname" . }}
+ heritage: {{ .Release.Service }}
+type: Opaque
+data:
+ code_reference_proto_descriptor.pb: {{ required "Envoy code reference descriptor is required" .Values.envoy.coderefDescriptor | quote }}
+---
+apiVersion: v1
+kind: Secret
metadata:
name: {{ template "web.fullname" . }}-batch
labels:
diff --git a/manifests/bucketeer/charts/web/values.yaml b/manifests/bucketeer/charts/web/values.yaml
index 0e90db1e31..436f75ca11 100644
--- a/manifests/bucketeer/charts/web/values.yaml
+++ b/manifests/bucketeer/charts/web/values.yaml
@@ -106,21 +106,22 @@ envoy:
eventcounterDescriptor: CrEBCiJwcm90by9ldmVudGNvdW50ZXIvaGlzdG9ncmFtLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyIjMKCUhpc3RvZ3JhbRISCgRoaXN0GAEgAygDUgRoaXN0EhIKBGJpbnMYAiADKAFSBGJpbnNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCqADCi1wcm90by9ldmVudGNvdW50ZXIvZGlzdHJpYnV0aW9uX3N1bW1hcnkucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaInByb3RvL2V2ZW50Y291bnRlci9oaXN0b2dyYW0ucHJvdG8i8gEKE0Rpc3RyaWJ1dGlvblN1bW1hcnkSEgoEbWVhbhgBIAEoAVIEbWVhbhIOCgJzZBgCIAEoAVICc2QSEgoEcmhhdBgDIAEoAVIEcmhhdBI/CgloaXN0b2dyYW0YBCABKAsyIS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkhpc3RvZ3JhbVIJaGlzdG9ncmFtEhYKBm1lZGlhbhgFIAEoAVIGbWVkaWFuEiQKDXBlcmNlbnRpbGUwMjUYBiABKAFSDXBlcmNlbnRpbGUwMjUSJAoNcGVyY2VudGlsZTk3NRgHIAEoAVINcGVyY2VudGlsZTk3NUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK0QMKKHByb3RvL2V2ZW50Y291bnRlci92YXJpYXRpb25fY291bnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIizAIKDlZhcmlhdGlvbkNvdW50EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSHQoKdXNlcl9jb3VudBgCIAEoA1IJdXNlckNvdW50Eh8KC2V2ZW50X2NvdW50GAMgASgDUgpldmVudENvdW50EhsKCXZhbHVlX3N1bRgEIAEoAVIIdmFsdWVTdW0SHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0EicKD3ZhcmlhdGlvbl92YWx1ZRgGIAEoCVIOdmFyaWF0aW9uVmFsdWUSNAoXdmFsdWVfc3VtX3Blcl91c2VyX21lYW4YByABKAFSE3ZhbHVlU3VtUGVyVXNlck1lYW4SPAobdmFsdWVfc3VtX3Blcl91c2VyX3ZhcmlhbmNlGAggASgBUhd2YWx1ZVN1bVBlclVzZXJWYXJpYW5jZUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK1AMKKXByb3RvL2V2ZW50Y291bnRlci9ldmFsdWF0aW9uX2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIqQCCg9FdmFsdWF0aW9uQ291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEk8KD3JlYWx0aW1lX2NvdW50cxgEIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEkkKDGJhdGNoX2NvdW50cxgFIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSC2JhdGNoQ291bnRzEh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdEI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKhgYKKXByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIo4DCg9FeHBlcmltZW50Q291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEhsKB2dvYWxfaWQYBCABKAlCAhgBUgZnb2FsSWQSUwoPcmVhbHRpbWVfY291bnRzGAUgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudEICGAFSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgGIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50cxIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSQwoLZ29hbF9jb3VudHMYCCADKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdvYWxDb3VudHNSCmdvYWxDb3VudHMixQEKCkdvYWxDb3VudHMSFwoHZ29hbF9pZBgBIAEoCVIGZ29hbElkEk8KD3JlYWx0aW1lX2NvdW50cxgCIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgDIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKvQMKI3Byb3RvL2V2ZW50Y291bnRlci90aW1lc2VyaWVzLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyInwKE1ZhcmlhdGlvblRpbWVzZXJpZXMSIQoMdmFyaWF0aW9uX2lkGAEgASgJUgt2YXJpYXRpb25JZBJCCgp0aW1lc2VyaWVzGAIgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUgp0aW1lc2VyaWVzIr8BCgpUaW1lc2VyaWVzEh4KCnRpbWVzdGFtcHMYASADKANSCnRpbWVzdGFtcHMSFgoGdmFsdWVzGAIgAygBUgZ2YWx1ZXMSOwoEdW5pdBgDIAEoDjInLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllcy5Vbml0UgR1bml0EiEKDHRvdGFsX2NvdW50cxgEIAEoA1ILdG90YWxDb3VudHMiGQoEVW5pdBIICgRIT1VSEAASBwoDREFZEAFCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCrATCilwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchoocHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9jb3VudC5wcm90bxotcHJvdG8vZXZlbnRjb3VudGVyL2Rpc3RyaWJ1dGlvbl9zdW1tYXJ5LnByb3RvGiNwcm90by9ldmVudGNvdW50ZXIvdGltZXNlcmllcy5wcm90byKsEQoPVmFyaWF0aW9uUmVzdWx0EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSUQoQZXhwZXJpbWVudF9jb3VudBgCIAEoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSD2V4cGVyaW1lbnRDb3VudBJRChBldmFsdWF0aW9uX2NvdW50GAMgASgLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPZXZhbHVhdGlvbkNvdW50Ek8KDWN2cl9wcm9iX2Jlc3QYBCABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSC2N2clByb2JCZXN0EmAKFmN2cl9wcm9iX2JlYXRfYmFzZWxpbmUYBSABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSE2N2clByb2JCZWF0QmFzZWxpbmUSRgoIY3ZyX3Byb2IYBiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSB2N2clByb2ISawogZXZhbHVhdGlvbl91c2VyX2NvdW50X3RpbWVzZXJpZXMYByABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSHWV2YWx1YXRpb25Vc2VyQ291bnRUaW1lc2VyaWVzEm0KIWV2YWx1YXRpb25fZXZlbnRfY291bnRfdGltZXNlcmllcxgIIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IeZXZhbHVhdGlvbkV2ZW50Q291bnRUaW1lc2VyaWVzEl8KGmdvYWxfdXNlcl9jb3VudF90aW1lc2VyaWVzGAkgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhdnb2FsVXNlckNvdW50VGltZXNlcmllcxJhChtnb2FsX2V2ZW50X2NvdW50X3RpbWVzZXJpZXMYCiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSGGdvYWxFdmVudENvdW50VGltZXNlcmllcxJdChlnb2FsX3ZhbHVlX3N1bV90aW1lc2VyaWVzGAsgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhZnb2FsVmFsdWVTdW1UaW1lc2VyaWVzElYKFWN2cl9tZWRpYW5fdGltZXNlcmllcxgMIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1ITY3ZyTWVkaWFuVGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTAyNV90aW1lc2VyaWVzGA0gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlMDI1VGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTk3NV90aW1lc2VyaWVzGA4gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlOTc1VGltZXNlcmllcxJJCg5jdnJfdGltZXNlcmllcxgPIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1INY3ZyVGltZXNlcmllcxJtCiJnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl90aW1lc2VyaWVzGBAgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUh1nb2FsVmFsdWVTdW1QZXJVc2VyVGltZXNlcmllcxJqChxnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iGBEgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5Uhdnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYhJzCiFnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iX2Jlc3QYEiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSG2dvYWxWYWx1ZVN1bVBlclVzZXJQcm9iQmVzdBKEAQoqZ29hbF92YWx1ZV9zdW1fcGVyX3VzZXJfcHJvYl9iZWF0X2Jhc2VsaW5lGBMgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5UiNnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYkJlYXRCYXNlbGluZRJ6Cilnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9tZWRpYW5fdGltZXNlcmllcxgUIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IjZ29hbFZhbHVlU3VtUGVyVXNlck1lZGlhblRpbWVzZXJpZXMSiAEKMGdvYWxfdmFsdWVfc3VtX3Blcl91c2VyX3BlcmNlbnRpbGUwMjVfdGltZXNlcmllcxgVIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IqZ29hbFZhbHVlU3VtUGVyVXNlclBlcmNlbnRpbGUwMjVUaW1lc2VyaWVzEogBCjBnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wZXJjZW50aWxlOTc1X3RpbWVzZXJpZXMYFiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSKmdvYWxWYWx1ZVN1bVBlclVzZXJQZXJjZW50aWxlOTc1VGltZXNlcmllc0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKpgIKJHByb3RvL2V2ZW50Y291bnRlci9nb2FsX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchopcHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9yZXN1bHQucHJvdG8iewoKR29hbFJlc3VsdBIXCgdnb2FsX2lkGAEgASgJUgZnb2FsSWQSVAoRdmFyaWF0aW9uX3Jlc3VsdHMYAiADKAsyJy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlZhcmlhdGlvblJlc3VsdFIQdmFyaWF0aW9uUmVzdWx0c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK2gIKKnByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchokcHJvdG8vZXZlbnRjb3VudGVyL2dvYWxfcmVzdWx0LnByb3RvIq0BChBFeHBlcmltZW50UmVzdWx0Eg4KAmlkGAEgASgJUgJpZBIjCg1leHBlcmltZW50X2lkGAIgASgJUgxleHBlcmltZW50SWQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0EkUKDGdvYWxfcmVzdWx0cxgEIAMoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR29hbFJlc3VsdFILZ29hbFJlc3VsdHNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCp4CChpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUisQEKBlJlYXNvbhIyCgR0eXBlGAEgASgOMh4uYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uLlR5cGVSBHR5cGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIloKBFR5cGUSCgoGVEFSR0VUEAASCAoEUlVMRRABEgsKB0RFRkFVTFQQAxIKCgZDTElFTlQQBBIRCg1PRkZfVkFSSUFUSU9OEAUSEAoMUFJFUkVRVUlTSVRFEAZCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqYBgoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aGnByb3RvL2ZlYXR1cmUvcmVhc29uLnByb3RvIuMCCgpFdmFsdWF0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIXCgd1c2VyX2lkGAQgASgJUgZ1c2VySWQSIQoMdmFyaWF0aW9uX2lkGAUgASgJUgt2YXJpYXRpb25JZBI+Cgl2YXJpYXRpb24YBiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25CAhgBUgl2YXJpYXRpb24SMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SJwoPdmFyaWF0aW9uX3ZhbHVlGAggASgJUg52YXJpYXRpb25WYWx1ZRIlCg52YXJpYXRpb25fbmFtZRgJIAEoCVINdmFyaWF0aW9uTmFtZSKGAgoPVXNlckV2YWx1YXRpb25zEhIKAmlkGAEgASgJQgIYAVICaWQSPwoLZXZhbHVhdGlvbnMYAiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgtldmFsdWF0aW9ucxIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSMAoUYXJjaGl2ZWRfZmVhdHVyZV9pZHMYBCADKAlSEmFyY2hpdmVkRmVhdHVyZUlkcxIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIioKBVN0YXRlEgoKBlFVRVVFRBAAEgsKB1BBUlRJQUwQARIICgRGVUxMEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrABAoVcHJvdG8vdXNlci91c2VyLnByb3RvEg5idWNrZXRlZXIudXNlciLeAwoEVXNlchIOCgJpZBgBIAEoCVICaWQSMgoEZGF0YRgCIAMoCzIeLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YUVudHJ5UgRkYXRhEkUKC3RhZ2dlZF9kYXRhGAMgAygLMiQuYnVja2V0ZWVyLnVzZXIuVXNlci5UYWdnZWREYXRhRW50cnlSCnRhZ2dlZERhdGESGwoJbGFzdF9zZWVuGAQgASgDUghsYXN0U2VlbhIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQafAoERGF0YRI6CgV2YWx1ZRgBIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YS5WYWx1ZUVudHJ5UgV2YWx1ZRo4CgpWYWx1ZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaWAoPVGFnZ2VkRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuYnVja2V0ZWVyLnVzZXIuVXNlci5EYXRhUgV2YWx1ZToCOAFCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3VzZXJiBnByb3RvMwrGNAoecHJvdG8vZXZlbnQvY2xpZW50L2V2ZW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnQuY2xpZW50Ghlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoacHJvdG8vZmVhdHVyZS9yZWFzb24ucHJvdG8aFXByb3RvL3VzZXIvdXNlci5wcm90byJwCgVFdmVudBIOCgJpZBgBIAEoCVICaWQSKgoFZXZlbnQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCKSBAoPRXZhbHVhdGlvbkV2ZW50EhwKCXRpbWVzdGFtcBgBIAEoA1IJdGltZXN0YW1wEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEhcKB3VzZXJfaWQYBCABKAlSBnVzZXJJZBIhCgx2YXJpYXRpb25faWQYBSABKAlSC3ZhcmlhdGlvbklkEigKBHVzZXIYBiABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEjEKBnJlYXNvbhgHIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlJlYXNvblIGcmVhc29uEhAKA3RhZxgIIAEoCVIDdGFnEj0KCXNvdXJjZV9pZBgJIAEoDjIgLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU291cmNlSWRSCHNvdXJjZUlkEh8KC3Nka192ZXJzaW9uGAogASgJUgpzZGtWZXJzaW9uElEKCG1ldGFkYXRhGAsgAygLMjUuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5FdmFsdWF0aW9uRXZlbnQuTWV0YWRhdGFFbnRyeVIIbWV0YWRhdGEaOwoNTWV0YWRhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBItwDCglHb2FsRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASFwoHZ29hbF9pZBgCIAEoCVIGZ29hbElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBIUCgV2YWx1ZRgEIAEoAVIFdmFsdWUSKAoEdXNlchgFIAEoCzIULmJ1Y2tldGVlci51c2VyLlVzZXJSBHVzZXISQwoLZXZhbHVhdGlvbnMYBiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uQgIYAVILZXZhbHVhdGlvbnMSEAoDdGFnGAcgASgJUgN0YWcSPQoJc291cmNlX2lkGAggASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YCSABKAlSCnNka1ZlcnNpb24SSwoIbWV0YWRhdGEYCiADKAsyLy5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkdvYWxFdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEixQIKDE1ldHJpY3NFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIqCgVldmVudBgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBWV2ZW50Ej0KCXNvdXJjZV9pZBgDIAEoDjIgLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU291cmNlSWRSCHNvdXJjZUlkEh8KC3Nka192ZXJzaW9uGAQgASgJUgpzZGtWZXJzaW9uEk4KCG1ldGFkYXRhGAUgAygLMjIuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5NZXRyaWNzRXZlbnQuTWV0YWRhdGFFbnRyeVIIbWV0YWRhdGEaOwoNTWV0YWRhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIvYBCiBHZXRFdmFsdWF0aW9uTGF0ZW5jeU1ldHJpY3NFdmVudBJcCgZsYWJlbHMYASADKAsyRC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkdldEV2YWx1YXRpb25MYXRlbmN5TWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMSNQoIZHVyYXRpb24YAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SCGR1cmF0aW9uGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE6AhgBItYBCh1HZXRFdmFsdWF0aW9uU2l6ZU1ldHJpY3NFdmVudBJZCgZsYWJlbHMYASADKAsyQS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkdldEV2YWx1YXRpb25TaXplTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMSGwoJc2l6ZV9ieXRlGAIgASgFUghzaXplQnl0ZRo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBOgIYASK5AgoTTGF0ZW5jeU1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJPCgZsYWJlbHMYAiADKAsyNy5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkxhdGVuY3lNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxI5CghkdXJhdGlvbhgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkICGAFSCGR1cmF0aW9uEiUKDmxhdGVuY3lfc2Vjb25kGAQgASgBUg1sYXRlbmN5U2Vjb25kGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi7gEKEFNpemVNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSTAoGbGFiZWxzGAIgAygLMjQuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5TaXplTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMSGwoJc2l6ZV9ieXRlGAMgASgFUghzaXplQnl0ZRo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjUKHVRpbWVvdXRFcnJvckNvdW50TWV0cmljc0V2ZW50EhAKA3RhZxgBIAEoCVIDdGFnOgIYASI2Ch5JbnRlcm5hbEVycm9yQ291bnRNZXRyaWNzRXZlbnQSEAoDdGFnGAEgASgJUgN0YWc6AhgBIvEBCiBSZWRpcmVjdGlvblJlcXVlc3RFeGNlcHRpb25FdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJcCgZsYWJlbHMYAiADKAsyRC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlJlZGlyZWN0aW9uUmVxdWVzdEV4Y2VwdGlvbkV2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLnAQobQmFkUmVxdWVzdEVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElcKBmxhYmVscxgCIAMoCzI/LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQmFkUmVxdWVzdEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLrAQodVW5hdXRob3JpemVkRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWQoGbGFiZWxzGAIgAygLMkEuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5VbmF1dGhvcml6ZWRFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi5QEKGkZvcmJpZGRlbkVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElYKBmxhYmVscxgCIAMoCzI+LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuRm9yYmlkZGVuRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuMBChlOb3RGb3VuZEVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElUKBmxhYmVscxgCIAMoCzI9LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTm90Rm91bmRFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi6wEKHVBheWxvYWRUb29MYXJnZUV4Y2VwdGlvbkV2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElkKBmxhYmVscxgCIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuUGF5bG9hZFRvb0xhcmdlRXhjZXB0aW9uRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIvkBCiRDbGllbnRDbG9zZWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSYAoGbGFiZWxzGAIgAygLMkguYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5DbGllbnRDbG9zZWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIu8BCh9JbnRlcm5hbFNlcnZlckVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElsKBmxhYmVscxgCIAMoCzJDLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuSW50ZXJuYWxTZXJ2ZXJFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9wEKI1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEl8KBmxhYmVscxgCIAMoCzJHLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU2VydmljZVVuYXZhaWxhYmxlRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuEBChhUaW1lb3V0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVAoGbGFiZWxzGAIgAygLMjwuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5UaW1lb3V0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuMBChlJbnRlcm5hbEVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElUKBmxhYmVscxgCIAMoCzI9LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuSW50ZXJuYWxFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4QEKGE5ldHdvcmtFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJUCgZsYWJlbHMYAiADKAsyPC5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk5ldHdvcmtFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi6QEKHEludGVybmFsU2RrRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWAoGbGFiZWxzGAIgAygLMkAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbFNka0Vycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLhAQoYVW5rbm93bkVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElQKBmxhYmVscxgCIAMoCzI8LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuVW5rbm93bkVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAQoIT3BzRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SIQoMdmFyaWF0aW9uX2lkGAQgASgJUgt2YXJpYXRpb25JZBIXCgdnb2FsX2lkGAUgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgGIAEoCVIGdXNlcklkIlwKDVVzZXJHb2FsRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASFwoHZ29hbF9pZBgCIAEoCVIGZ29hbElkEhQKBXZhbHVlGAMgASgBUgV2YWx1ZSpwCghTb3VyY2VJZBILCgdVTktOT1dOEAASCwoHQU5EUk9JRBABEgcKA0lPUxACEgsKA1dFQhADGgIIARINCglHT19TRVJWRVIQBRIPCgtOT0RFX1NFUlZFUhAGEg4KCkpBVkFTQ1JJUFQQByIECAQQBCqbAQoFQXBpSWQSDwoLVU5LTk9XTl9BUEkQABISCg5HRVRfRVZBTFVBVElPThABEhMKD0dFVF9FVkFMVUFUSU9OUxACEhMKD1JFR0lTVEVSX0VWRU5UUxADEhUKEUdFVF9GRUFUVVJFX0ZMQUdTEAQSFQoRR0VUX1NFR01FTlRfVVNFUlMQBRIVChFTREtfR0VUX1ZBUklBVElPThBkQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudC9jbGllbnRiBnByb3RvMwq1BAokcHJvdG8vZXZlbnRjb3VudGVyL21hdV9zdW1tYXJ5LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGh5wcm90by9ldmVudC9jbGllbnQvZXZlbnQucHJvdG8ilAMKCk1BVVN1bW1hcnkSHAoJeWVhcm1vbnRoGAEgASgJUgl5ZWFybW9udGgSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHQoKdXNlcl9jb3VudBgEIAEoA1IJdXNlckNvdW50EiMKDXJlcXVlc3RfY291bnQYBSABKANSDHJlcXVlc3RDb3VudBIpChBldmFsdWF0aW9uX2NvdW50GAYgASgDUg9ldmFsdWF0aW9uQ291bnQSHQoKZ29hbF9jb3VudBgHIAEoA1IJZ29hbENvdW50EhUKBmlzX2FsbBgIIAEoCFIFaXNBbGwSHwoLaXNfZmluaXNoZWQYCSABKAhSCmlzRmluaXNoZWQSHQoKY3JlYXRlZF9hdBgKIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCyABKANSCXVwZGF0ZWRBdEI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKhgQKHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIiMKC0RvdWJsZVZhbHVlEhQKBXZhbHVlGAEgASgBUgV2YWx1ZSIiCgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZSIiCgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZSIjCgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWUiIgoKSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWUiIwoLVUludDMyVmFsdWUSFAoFdmFsdWUYASABKA1SBXZhbHVlIiEKCUJvb2xWYWx1ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWUiIwoLU3RyaW5nVmFsdWUSFAoFdmFsdWUYASABKAlSBXZhbHVlIiIKCkJ5dGVzVmFsdWUSFAoFdmFsdWUYASABKAxSBXZhbHVlQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwrhIwogcHJvdG8vZXZlbnRjb3VudGVyL3NlcnZpY2UucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoqcHJvdG8vZXZlbnRjb3VudGVyL2V4cGVyaW1lbnRfcmVzdWx0LnByb3RvGiNwcm90by9ldmVudGNvdW50ZXIvdGltZXNlcmllcy5wcm90bxoocHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9jb3VudC5wcm90byLxAQojR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudFJlcXVlc3QSGQoIc3RhcnRfYXQYAiABKANSB3N0YXJ0QXQSFQoGZW5kX2F0GAMgASgDUgVlbmRBdBIdCgpmZWF0dXJlX2lkGAQgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAUgASgFUg5mZWF0dXJlVmVyc2lvbhIjCg12YXJpYXRpb25faWRzGAYgAygJUgx2YXJpYXRpb25JZHMSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiwQEKJEdldEV4cGVyaW1lbnRFdmFsdWF0aW9uQ291bnRSZXNwb25zZRIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAIgASgFUg5mZWF0dXJlVmVyc2lvbhJRChB2YXJpYXRpb25fY291bnRzGAMgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPdmFyaWF0aW9uQ291bnRzIrwCCiNHZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50UmVxdWVzdBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSZAoKdGltZV9yYW5nZRgDIAEoDjJFLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlcXVlc3QuVGltZVJhbmdlUgl0aW1lUmFuZ2USJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWQiYwoJVGltZVJhbmdlEgsKB1VOS05PV04QABIVChFUV0VOVFlfRk9VUl9IT1VSUxABEg4KClNFVkVOX0RBWVMQAhIRCg1GT1VSVEVFTl9EQVlTEAMSDwoLVEhJUlRZX0RBWVMQBEoECAEQAiLEAQokR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlEkwKC3VzZXJfY291bnRzGAEgAygLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25UaW1lc2VyaWVzUgp1c2VyQ291bnRzEk4KDGV2ZW50X2NvdW50cxgCIAMoCzIrLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uVGltZXNlcmllc1ILZXZlbnRDb3VudHMibgoaR2V0RXhwZXJpbWVudFJlc3VsdFJlcXVlc3QSIwoNZXhwZXJpbWVudF9pZBgCIAEoCVIMZXhwZXJpbWVudElkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIARACInQKG0dldEV4cGVyaW1lbnRSZXN1bHRSZXNwb25zZRJVChFleHBlcmltZW50X3Jlc3VsdBgBIAEoCzIoLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuRXhwZXJpbWVudFJlc3VsdFIQZXhwZXJpbWVudFJlc3VsdCKwAQocTGlzdEV4cGVyaW1lbnRSZXN1bHRzUmVxdWVzdBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSRAoPZmVhdHVyZV92ZXJzaW9uGAIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSDmZlYXR1cmVWZXJzaW9uEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIuMBCh1MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXNwb25zZRJcCgdyZXN1bHRzGAEgAygLMkIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXNwb25zZS5SZXN1bHRzRW50cnlSB3Jlc3VsdHMaZAoMUmVzdWx0c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ej4KBXZhbHVlGAIgASgLMiguYnVja2V0ZWVyLmV2ZW50Y291bnRlci5FeHBlcmltZW50UmVzdWx0UgV2YWx1ZToCOAEihAIKHUdldEV4cGVyaW1lbnRHb2FsQ291bnRSZXF1ZXN0EhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0EhUKBmVuZF9hdBgDIAEoA1IFZW5kQXQSFwoHZ29hbF9pZBgEIAEoCVIGZ29hbElkEh0KCmZlYXR1cmVfaWQYBSABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBiABKAVSDmZlYXR1cmVWZXJzaW9uEiMKDXZhcmlhdGlvbl9pZHMYByADKAlSDHZhcmlhdGlvbklkcxIlCg5lbnZpcm9ubWVudF9pZBgIIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiKMAQoeR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlEhcKB2dvYWxfaWQYASABKAlSBmdvYWxJZBJRChB2YXJpYXRpb25fY291bnRzGAIgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPdmFyaWF0aW9uQ291bnRzIvcBCiBHZXRPcHNFdmFsdWF0aW9uVXNlckNvdW50UmVxdWVzdBIeCgtvcHNfcnVsZV9pZBgCIAEoCVIJb3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSHQoKZmVhdHVyZV9pZBgEIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgFIAEoBVIOZmVhdHVyZVZlcnNpb24SIQoMdmFyaWF0aW9uX2lkGAYgASgJUgt2YXJpYXRpb25JZBIlCg5lbnZpcm9ubWVudF9pZBgHIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiJ2CiFHZXRPcHNFdmFsdWF0aW9uVXNlckNvdW50UmVzcG9uc2USHgoLb3BzX3J1bGVfaWQYASABKAlSCW9wc1J1bGVJZBIbCgljbGF1c2VfaWQYAiABKAlSCGNsYXVzZUlkEhQKBWNvdW50GAMgASgDUgVjb3VudCLxAQoaR2V0T3BzR29hbFVzZXJDb3VudFJlcXVlc3QSHgoLb3BzX3J1bGVfaWQYAiABKAlSCW9wc1J1bGVJZBIbCgljbGF1c2VfaWQYAyABKAlSCGNsYXVzZUlkEh0KCmZlYXR1cmVfaWQYBCABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBSABKAVSDmZlYXR1cmVWZXJzaW9uEiEKDHZhcmlhdGlvbl9pZBgGIAEoCVILdmFyaWF0aW9uSWQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWRKBAgBEAIicAobR2V0T3BzR29hbFVzZXJDb3VudFJlc3BvbnNlEh4KC29wc19ydWxlX2lkGAEgASgJUglvcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAIgASgJUghjbGF1c2VJZBIUCgVjb3VudBgDIAEoA1IFY291bnQiYAoSR2V0TUFVQ291bnRSZXF1ZXN0Eh0KCnllYXJfbW9udGgYAiABKAlSCXllYXJNb250aBIlCg5lbnZpcm9ubWVudF9pZBgDIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiJVChNHZXRNQVVDb3VudFJlc3BvbnNlEh8KC2V2ZW50X2NvdW50GAEgASgDUgpldmVudENvdW50Eh0KCnVzZXJfY291bnQYAiABKANSCXVzZXJDb3VudCJbChlTdW1tYXJpemVNQVVDb3VudHNSZXF1ZXN0Eh0KCnllYXJfbW9udGgYASABKAlSCXllYXJNb250aBIfCgtpc19maW5pc2hlZBgCIAEoCFIKaXNGaW5pc2hlZCIcChpTdW1tYXJpemVNQVVDb3VudHNSZXNwb25zZTLqCQoTRXZlbnRDb3VudGVyU2VydmljZRKbAQocR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudBI7LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudFJlcXVlc3QaPC5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRFdmFsdWF0aW9uQ291bnRSZXNwb25zZSIAEpsBChxHZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50EjsuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50UmVxdWVzdBo8LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlIgASgAEKE0dldEV4cGVyaW1lbnRSZXN1bHQSMi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRSZXN1bHRSZXF1ZXN0GjMuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50UmVzdWx0UmVzcG9uc2UiABKGAQoVTGlzdEV4cGVyaW1lbnRSZXN1bHRzEjQuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXF1ZXN0GjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXNwb25zZSIAEokBChZHZXRFeHBlcmltZW50R29hbENvdW50EjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50R29hbENvdW50UmVxdWVzdBo2LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlIgASaAoLR2V0TUFVQ291bnQSKi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE1BVUNvdW50UmVxdWVzdBorLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0TUFVQ291bnRSZXNwb25zZSIAEn0KElN1bW1hcml6ZU1BVUNvdW50cxIxLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVxdWVzdBoyLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVzcG9uc2UiABKSAQoZR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudBI4LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudFJlcXVlc3QaOS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE9wc0V2YWx1YXRpb25Vc2VyQ291bnRSZXNwb25zZSIAEoABChNHZXRPcHNHb2FsVXNlckNvdW50EjIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRPcHNHb2FsVXNlckNvdW50UmVxdWVzdBozLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzR29hbFVzZXJDb3VudFJlc3BvbnNlIgBCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8z
autoopsDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCpoLChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8ihgEKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEj4KC2FjdGlvbl90eXBlGAMgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSLfAgoST3BzRXZlbnRSYXRlQ2xhdXNlEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQSFwoHZ29hbF9pZBgDIAEoCVIGZ29hbElkEhsKCW1pbl9jb3VudBgEIAEoA1IIbWluQ291bnQSKQoQdGhyZWFkc2hvbGRfcmF0ZRgFIAEoAVIPdGhyZWFkc2hvbGRSYXRlEkoKCG9wZXJhdG9yGAYgASgOMi4uYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchI+CgthY3Rpb25fdHlwZRgHIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiJkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lEj4KC2FjdGlvbl90eXBlGAIgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADKjIKCkFjdGlvblR5cGUSCwoHVU5LTk9XThAAEgoKBkVOQUJMRRABEgsKB0RJU0FCTEUQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCr0FCiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90byLQAgoLQXV0b09wc1J1bGUSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgDIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgEIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQSSAoPYXV0b19vcHNfc3RhdHVzGAogASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1INYXV0b09wc1N0YXR1c0oECAYQByJUCgxBdXRvT3BzUnVsZXMSRAoOYXV0b19vcHNfcnVsZXMYASADKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVIMYXV0b09wc1J1bGVzKj8KB09wc1R5cGUSEAoMVFlQRV9VTktOT1dOEAASDAoIU0NIRURVTEUQAhIOCgpFVkVOVF9SQVRFEAMiBAgBEAEqRAoNQXV0b09wc1N0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK9wUKJ3Byb3RvL2F1dG9vcHMvcHJvZ3Jlc3NpdmVfcm9sbG91dC5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8i4gQKElByb2dyZXNzaXZlUm9sbG91dBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEiwKBmNsYXVzZRgDIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBmNsYXVzZRJECgZzdGF0dXMYBCABKA4yLC5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RhdHVzUgZzdGF0dXMSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBI+CgR0eXBlGAcgASgOMiouYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlR5cGVSBHR5cGUSTgoKc3RvcHBlZF9ieRgIIAEoDjIvLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdG9wcGVkQnlSCXN0b3BwZWRCeRIdCgpzdG9wcGVkX2F0GAkgASgDUglzdG9wcGVkQXQiMgoEVHlwZRITCg9NQU5VQUxfU0NIRURVTEUQABIVChFURU1QTEFURV9TQ0hFRFVMRRABIj0KBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADIkkKCVN0b3BwZWRCeRILCgdVTktOT1dOEAASCAoEVVNFUhABEhAKDE9QU19TQ0hFRFVMRRACEhMKD09QU19LSUxMX1NXSVRDSBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMKrBEKG3Byb3RvL2F1dG9vcHMvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaIXByb3RvL2F1dG9vcHMvYXV0b19vcHNfcnVsZS5wcm90bxoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8aJ3Byb3RvL2F1dG9vcHMvcHJvZ3Jlc3NpdmVfcm9sbG91dC5wcm90byKaAgoYQ3JlYXRlQXV0b09wc1J1bGVDb21tYW5kEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgCIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSWgoWb3BzX2V2ZW50X3JhdGVfY2xhdXNlcxgDIAMoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVITb3BzRXZlbnRSYXRlQ2xhdXNlcxJMChBkYXRldGltZV9jbGF1c2VzGAQgAygLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSD2RhdGV0aW1lQ2xhdXNlcyIaChhEZWxldGVBdXRvT3BzUnVsZUNvbW1hbmQiGAoWU3RvcEF1dG9PcHNSdWxlQ29tbWFuZCJWChpDaGFuZ2VBdXRvT3BzU3RhdHVzQ29tbWFuZBI4CgZzdGF0dXMYASABKA4yIC5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzU3RhdHVzUgZzdGF0dXMiOAoZRXhlY3V0ZUF1dG9PcHNSdWxlQ29tbWFuZBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkIngKHEFkZE9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmQSWAoVb3BzX2V2ZW50X3JhdGVfY2xhdXNlGAEgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhJvcHNFdmVudFJhdGVDbGF1c2UiiwEKH0NoYW5nZU9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkElgKFW9wc19ldmVudF9yYXRlX2NsYXVzZRgCIAEoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVISb3BzRXZlbnRSYXRlQ2xhdXNlIiUKE0RlbGV0ZUNsYXVzZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkImYKGEFkZERhdGV0aW1lQ2xhdXNlQ29tbWFuZBJKCg9kYXRldGltZV9jbGF1c2UYASABKAsyIS5idWNrZXRlZXIuYXV0b29wcy5EYXRldGltZUNsYXVzZVIOZGF0ZXRpbWVDbGF1c2UieQobQ2hhbmdlRGF0ZXRpbWVDbGF1c2VDb21tYW5kEg4KAmlkGAEgASgJUgJpZBJKCg9kYXRldGltZV9jbGF1c2UYAiABKAsyIS5idWNrZXRlZXIuYXV0b29wcy5EYXRldGltZUNsYXVzZVIOZGF0ZXRpbWVDbGF1c2Ui4AMKH0NyZWF0ZVByb2dyZXNzaXZlUm9sbG91dENvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEpoBCipwcm9ncmVzc2l2ZV9yb2xsb3V0X21hbnVhbF9zY2hlZHVsZV9jbGF1c2UYAiABKAsyOS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRNYW51YWxTY2hlZHVsZUNsYXVzZUgAUiZwcm9ncmVzc2l2ZVJvbGxvdXRNYW51YWxTY2hlZHVsZUNsYXVzZYgBARKgAQoscHJvZ3Jlc3NpdmVfcm9sbG91dF90ZW1wbGF0ZV9zY2hlZHVsZV9jbGF1c2UYAyABKAsyOy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRUZW1wbGF0ZVNjaGVkdWxlQ2xhdXNlSAFSKHByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2WIAQFCLQorX3Byb2dyZXNzaXZlX3JvbGxvdXRfbWFudWFsX3NjaGVkdWxlX2NsYXVzZUIvCi1fcHJvZ3Jlc3NpdmVfcm9sbG91dF90ZW1wbGF0ZV9zY2hlZHVsZV9jbGF1c2UibwodU3RvcFByb2dyZXNzaXZlUm9sbG91dENvbW1hbmQSTgoKc3RvcHBlZF9ieRgBIAEoDjIvLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdG9wcGVkQnlSCXN0b3BwZWRCeSIhCh9EZWxldGVQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kIoUBCjBBZGRQcm9ncmVzc2l2ZVJvbGxvdXRNYW51YWxTY2hlZHVsZUNsYXVzZUNvbW1hbmQSUQoGY2xhdXNlGAEgASgLMjkuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2VSBmNsYXVzZSKJAQoyQWRkUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZUNvbW1hbmQSUwoGY2xhdXNlGAEgASgLMjsuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZVIGY2xhdXNlIlUKMkNoYW5nZVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDb21tYW5kEh8KC3NjaGVkdWxlX2lkGAEgASgJUgpzY2hlZHVsZUlkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK4QIKHXByb3RvL2F1dG9vcHMvb3BzX2NvdW50LnByb3RvEhFidWNrZXRlZXIuYXV0b29wcyLxAQoIT3BzQ291bnQSDgoCaWQYASABKAlSAmlkEicKEGF1dG9fb3BzX3J1bGVfaWQYAiABKAlSDWF1dG9PcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIdCgp1cGRhdGVkX2F0GAQgASgDUgl1cGRhdGVkQXQSJgoPb3BzX2V2ZW50X2NvdW50GAUgASgDUg1vcHNFdmVudENvdW50EikKEGV2YWx1YXRpb25fY291bnQYBiABKANSD2V2YWx1YXRpb25Db3VudBIdCgpmZWF0dXJlX2lkGAcgASgJUglmZWF0dXJlSWRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwqVMAobcHJvdG8vYXV0b29wcy9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvGhtwcm90by9hdXRvb3BzL2NvbW1hbmQucHJvdG8aHXByb3RvL2F1dG9vcHMvb3BzX2NvdW50LnByb3RvGidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8iVAoVR2V0QXV0b09wc1J1bGVSZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBIlCg5lbnZpcm9ubWVudF9pZBgDIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiJcChZHZXRBdXRvT3BzUnVsZVJlc3BvbnNlEkIKDWF1dG9fb3BzX3J1bGUYASABKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVILYXV0b09wc1J1bGUijgEKGENyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBJFCgdjb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmF1dG9vcHMuQ3JlYXRlQXV0b09wc1J1bGVDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhsKGUNyZWF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UinAEKF0xpc3RBdXRvT3BzUnVsZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISHwoLZmVhdHVyZV9pZHMYBCADKAlSCmZlYXR1cmVJZHMSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgBEAIieAoYTGlzdEF1dG9PcHNSdWxlc1Jlc3BvbnNlEkQKDmF1dG9fb3BzX3J1bGVzGAEgAygLMh4uYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1J1bGVSDGF1dG9PcHNSdWxlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvciKaAQoWU3RvcEF1dG9PcHNSdWxlUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSQwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hdXRvb3BzLlN0b3BBdXRvT3BzUnVsZUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiGQoXU3RvcEF1dG9PcHNSdWxlUmVzcG9uc2UingEKGERlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSRQoHY29tbWFuZBgDIAEoCzIrLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIbChlEZWxldGVBdXRvT3BzUnVsZVJlc3BvbnNlIqIFChhVcGRhdGVBdXRvT3BzUnVsZVJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEnoKImFkZF9vcHNfZXZlbnRfcmF0ZV9jbGF1c2VfY29tbWFuZHMYBCADKAsyLy5idWNrZXRlZXIuYXV0b29wcy5BZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kUh1hZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kcxKDAQolY2hhbmdlX29wc19ldmVudF9yYXRlX2NsYXVzZV9jb21tYW5kcxgFIAMoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZU9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRSIGNoYW5nZU9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRzElwKFmRlbGV0ZV9jbGF1c2VfY29tbWFuZHMYBiADKAsyJi5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVDbGF1c2VDb21tYW5kUhRkZWxldGVDbGF1c2VDb21tYW5kcxJsChxhZGRfZGF0ZXRpbWVfY2xhdXNlX2NvbW1hbmRzGAcgAygLMisuYnVja2V0ZWVyLmF1dG9vcHMuQWRkRGF0ZXRpbWVDbGF1c2VDb21tYW5kUhlhZGREYXRldGltZUNsYXVzZUNvbW1hbmRzEnUKH2NoYW5nZV9kYXRldGltZV9jbGF1c2VfY29tbWFuZHMYCCADKAsyLi5idWNrZXRlZXIuYXV0b29wcy5DaGFuZ2VEYXRldGltZUNsYXVzZUNvbW1hbmRSHGNoYW5nZURhdGV0aW1lQ2xhdXNlQ29tbWFuZHMSJQoOZW52aXJvbm1lbnRfaWQYCSABKAlSDWVudmlyb25tZW50SWRKBAgBEAJKBAgDEAQiGwoZVXBkYXRlQXV0b09wc1J1bGVSZXNwb25zZSLKAQoVRXhlY3V0ZUF1dG9PcHNSZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBJuCh1leGVjdXRlX2F1dG9fb3BzX3J1bGVfY29tbWFuZBgEIAEoCzIsLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUnVsZUNvbW1hbmRSGWV4ZWN1dGVBdXRvT3BzUnVsZUNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgBEAJKBAgDEAQiRQoWRXhlY3V0ZUF1dG9PcHNSZXNwb25zZRIrChFhbHJlYWR5X3RyaWdnZXJlZBgBIAEoCFIQYWxyZWFkeVRyaWdnZXJlZCLEAQoUTGlzdE9wc0NvdW50c1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIpChFhdXRvX29wc19ydWxlX2lkcxgEIAMoCVIOYXV0b09wc1J1bGVJZHMSHwoLZmVhdHVyZV9pZHMYBSADKAlSCmZlYXR1cmVJZHMSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiawoVTGlzdE9wc0NvdW50c1Jlc3BvbnNlEhYKBmN1cnNvchgBIAEoCVIGY3Vyc29yEjoKCm9wc19jb3VudHMYAiADKAsyGy5idWNrZXRlZXIuYXV0b29wcy5PcHNDb3VudFIJb3BzQ291bnRzIpwBCh9DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EkwKB2NvbW1hbmQYAiABKAsyMi5idWNrZXRlZXIuYXV0b29wcy5DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIARACIiIKIENyZWF0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIlsKHEdldFByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIARACIncKHUdldFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlElYKE3Byb2dyZXNzaXZlX3JvbGxvdXQYASABKAsyJS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRSEnByb2dyZXNzaXZlUm9sbG91dCKoAQodU3RvcFByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEkoKB2NvbW1hbmQYAyABKAsyMC5idWNrZXRlZXIuYXV0b29wcy5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIgCh5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2UirAEKH0RlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEkwKB2NvbW1hbmQYAyABKAsyMi5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIARACIiIKIERlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIuUECh5MaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0c1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIfCgtmZWF0dXJlX2lkcxgEIAMoCVIKZmVhdHVyZUlkcxJUCghvcmRlcl9ieRgFIAEoDjI5LmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmkKD29yZGVyX2RpcmVjdGlvbhgGIAEoDjJALmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SSQoGc3RhdHVzGAcgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c0gAUgZzdGF0dXOIAQESQwoEdHlwZRgIIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlSAFSBHR5cGWIAQESJQoOZW52aXJvbm1lbnRfaWQYCSABKAlSDWVudmlyb25tZW50SWQiNgoHT3JkZXJCeRILCgdERUZBVUxUEAASDgoKQ1JFQVRFRF9BVBABEg4KClVQREFURURfQVQQAiIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFCCQoHX3N0YXR1c0IHCgVfdHlwZUoECAEQAiK0AQofTGlzdFByb2dyZXNzaXZlUm9sbG91dHNSZXNwb25zZRJYChRwcm9ncmVzc2l2ZV9yb2xsb3V0cxgBIAMoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFITcHJvZ3Jlc3NpdmVSb2xsb3V0cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKMAgogRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEqoBCi9jaGFuZ2VfcHJvZ3Jlc3NpdmVfcm9sbG91dF90cmlnZ2VyZWRfYXRfY29tbWFuZBgDIAEoCzJFLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDb21tYW5kUipjaGFuZ2VQcm9ncmVzc2l2ZVJvbGxvdXRUcmlnZ2VyZWRBdENvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiIwohRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlMpgNCg5BdXRvT3BzU2VydmljZRJnCg5HZXRBdXRvT3BzUnVsZRIoLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVzcG9uc2UiABJtChBMaXN0QXV0b09wc1J1bGVzEiouYnVja2V0ZWVyLmF1dG9vcHMuTGlzdEF1dG9PcHNSdWxlc1JlcXVlc3QaKy5idWNrZXRlZXIuYXV0b29wcy5MaXN0QXV0b09wc1J1bGVzUmVzcG9uc2UiABJwChFDcmVhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJqCg9TdG9wQXV0b09wc1J1bGUSKS5idWNrZXRlZXIuYXV0b29wcy5TdG9wQXV0b09wc1J1bGVSZXF1ZXN0GiouYnVja2V0ZWVyLmF1dG9vcHMuU3RvcEF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFEZWxldGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFVcGRhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJnCg5FeGVjdXRlQXV0b09wcxIoLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVzcG9uc2UiABJkCg1MaXN0T3BzQ291bnRzEicuYnVja2V0ZWVyLmF1dG9vcHMuTGlzdE9wc0NvdW50c1JlcXVlc3QaKC5idWNrZXRlZXIuYXV0b29wcy5MaXN0T3BzQ291bnRzUmVzcG9uc2UiABKFAQoYQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0EjIuYnVja2V0ZWVyLmF1dG9vcHMuQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBozLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfAoVR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0Ei8uYnVja2V0ZWVyLmF1dG9vcHMuR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBowLmJ1Y2tldGVlci5hdXRvb3BzLkdldFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfwoWU3RvcFByb2dyZXNzaXZlUm9sbG91dBIwLmJ1Y2tldGVlci5hdXRvb3BzLlN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjEuYnVja2V0ZWVyLmF1dG9vcHMuU3RvcFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgAShQEKGERlbGV0ZVByb2dyZXNzaXZlUm9sbG91dBIyLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QaMy5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXNwb25zZSIAEoIBChdMaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0cxIxLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdBoyLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVzcG9uc2UiABKIAQoZRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dBIzLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjQuYnVja2V0ZWVyLmF1dG9vcHMuRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgBCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMw==
authDescriptor: CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwriBQocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIpgBCgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEisgIKBVZhbHVlEjsKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSABSCW51bGxWYWx1ZRIjCgxudW1iZXJfdmFsdWUYAiABKAFIAFILbnVtYmVyVmFsdWUSIwoMc3RyaW5nX3ZhbHVlGAMgASgJSABSC3N0cmluZ1ZhbHVlEh8KCmJvb2xfdmFsdWUYBCABKAhIAFIJYm9vbFZhbHVlEjwKDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAFILc3RydWN0VmFsdWUSOwoKbGlzdF92YWx1ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIAFIJbGlzdFZhbHVlQgYKBGtpbmQiOwoJTGlzdFZhbHVlEi4KBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIGdmFsdWVzKhsKCU51bGxWYWx1ZRIOCgpOVUxMX1ZBTFVFEABCfwoTY29tLmdvb2dsZS5wcm90b2J1ZkILU3RydWN0UHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqmPgoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIrMICgdTd2FnZ2VyEhgKB3N3YWdnZXIYASABKAlSB3N3YWdnZXISQwoEaW5mbxgCIAEoCzIvLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm9SBGluZm8SEgoEaG9zdBgDIAEoCVIEaG9zdBIbCgliYXNlX3BhdGgYBCABKAlSCGJhc2VQYXRoEksKB3NjaGVtZXMYBSADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJfCglyZXNwb25zZXMYCiADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMScQoUc2VjdXJpdHlfZGVmaW5pdGlvbnMYCyABKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zUhNzZWN1cml0eURlZmluaXRpb25zEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSQgoEdGFncxgNIAMoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IEdGFncxJlCg1leHRlcm5hbF9kb2NzGA4gASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSYgoKZXh0ZW5zaW9ucxgPIAMoCzJCLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCUoECAkQCiLWBwoJT3BlcmF0aW9uEhIKBHRhZ3MYASADKAlSBHRhZ3MSGAoHc3VtbWFyeRgCIAEoCVIHc3VtbWFyeRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgEIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEiEKDG9wZXJhdGlvbl9pZBgFIAEoCVILb3BlcmF0aW9uSWQSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJhCglyZXNwb25zZXMYCSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJLCgdzY2hlbWVzGAogAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEh4KCmRlcHJlY2F0ZWQYCyABKAhSCmRlcHJlY2F0ZWQSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJkCgpleHRlbnNpb25zGA0gAygLMkQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxJVCgpwYXJhbWV0ZXJzGA4gASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUGFyYW1ldGVyc1IKcGFyYW1ldGVycxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAkiYgoKUGFyYW1ldGVycxJUCgdoZWFkZXJzGAEgAygLMjouZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyUgdoZWFkZXJzIqMCCg9IZWFkZXJQYXJhbWV0ZXISEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SUwoEdHlwZRgDIAEoDjI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlci5UeXBlUgR0eXBlEhYKBmZvcm1hdBgEIAEoCVIGZm9ybWF0EhoKCHJlcXVpcmVkGAUgASgIUghyZXF1aXJlZCJFCgRUeXBlEgsKB1VOS05PV04QABIKCgZTVFJJTkcQARIKCgZOVU1CRVIQAhILCgdJTlRFR0VSEAMSCwoHQk9PTEVBThAESgQIBhAHSgQIBxAIItgBCgZIZWFkZXISIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhIKBHR5cGUYAiABKAlSBHR5cGUSFgoGZm9ybWF0GAMgASgJUgZmb3JtYXQSGAoHZGVmYXVsdBgGIAEoCVIHZGVmYXVsdBIYCgdwYXR0ZXJuGA0gASgJUgdwYXR0ZXJuSgQIBBAFSgQIBRAGSgQIBxAISgQICBAJSgQICRAKSgQIChALSgQICxAMSgQIDBANSgQIDhAPSgQIDxAQSgQIEBARSgQIERASSgQIEhATIpoFCghSZXNwb25zZRIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SSQoGc2NoZW1hGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUgZzY2hlbWESWgoHaGVhZGVycxgDIAMoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxJdCghleGFtcGxlcxgEIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4YW1wbGVzRW50cnlSCGV4YW1wbGVzEmMKCmV4dGVuc2lvbnMYBSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMabQoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkcKBXZhbHVlGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUgV2YWx1ZToCOAEaOwoNRXhhbXBsZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBItYDCgRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SKAoQdGVybXNfb2Zfc2VydmljZRgDIAEoCVIOdGVybXNPZlNlcnZpY2USTAoHY29udGFjdBgEIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkNvbnRhY3RSB2NvbnRhY3QSTAoHbGljZW5zZRgFIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkxpY2Vuc2VSB2xpY2Vuc2USGAoHdmVyc2lvbhgGIAEoCVIHdmVyc2lvbhJfCgpleHRlbnNpb25zGAcgAygLMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mby5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiRQoHQ29udGFjdBISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsEhQKBWVtYWlsGAMgASgJUgVlbWFpbCIvCgdMaWNlbnNlEhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwiSwoVRXh0ZXJuYWxEb2N1bWVudGF0aW9uEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhIQCgN1cmwYAiABKAlSA3VybCKqAgoGU2NoZW1hElYKC2pzb25fc2NoZW1hGAEgASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIKanNvblNjaGVtYRIkCg1kaXNjcmltaW5hdG9yGAIgASgJUg1kaXNjcmltaW5hdG9yEhsKCXJlYWRfb25seRgDIAEoCFIIcmVhZE9ubHkSZQoNZXh0ZXJuYWxfZG9jcxgFIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEhgKB2V4YW1wbGUYBiABKAlSB2V4YW1wbGVKBAgEEAUi1woKCkpTT05TY2hlbWESEAoDcmVmGAMgASgJUgNyZWYSFAoFdGl0bGUYBSABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAYgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWZhdWx0GAcgASgJUgdkZWZhdWx0EhsKCXJlYWRfb25seRgIIAEoCFIIcmVhZE9ubHkSGAoHZXhhbXBsZRgJIAEoCVIHZXhhbXBsZRIfCgttdWx0aXBsZV9vZhgKIAEoAVIKbXVsdGlwbGVPZhIYCgdtYXhpbXVtGAsgASgBUgdtYXhpbXVtEisKEWV4Y2x1c2l2ZV9tYXhpbXVtGAwgASgIUhBleGNsdXNpdmVNYXhpbXVtEhgKB21pbmltdW0YDSABKAFSB21pbmltdW0SKwoRZXhjbHVzaXZlX21pbmltdW0YDiABKAhSEGV4Y2x1c2l2ZU1pbmltdW0SHQoKbWF4X2xlbmd0aBgPIAEoBFIJbWF4TGVuZ3RoEh0KCm1pbl9sZW5ndGgYECABKARSCW1pbkxlbmd0aBIYCgdwYXR0ZXJuGBEgASgJUgdwYXR0ZXJuEhsKCW1heF9pdGVtcxgUIAEoBFIIbWF4SXRlbXMSGwoJbWluX2l0ZW1zGBUgASgEUghtaW5JdGVtcxIhCgx1bmlxdWVfaXRlbXMYFiABKAhSC3VuaXF1ZUl0ZW1zEiUKDm1heF9wcm9wZXJ0aWVzGBggASgEUg1tYXhQcm9wZXJ0aWVzEiUKDm1pbl9wcm9wZXJ0aWVzGBkgASgEUg1taW5Qcm9wZXJ0aWVzEhoKCHJlcXVpcmVkGBogAygJUghyZXF1aXJlZBIUCgVhcnJheRgiIAMoCVIFYXJyYXkSXwoEdHlwZRgjIAMoDjJLLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuSlNPTlNjaGVtYVNpbXBsZVR5cGVzUgR0eXBlEhYKBmZvcm1hdBgkIAEoCVIGZm9ybWF0EhIKBGVudW0YLiADKAlSBGVudW0SegoTZmllbGRfY29uZmlndXJhdGlvbhjpByABKAsySC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkZpZWxkQ29uZmlndXJhdGlvblISZmllbGRDb25maWd1cmF0aW9uEmUKCmV4dGVuc2lvbnMYMCADKAsyRS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxo8ChJGaWVsZENvbmZpZ3VyYXRpb24SJgoPcGF0aF9wYXJhbV9uYW1lGC8gASgJUg1wYXRoUGFyYW1OYW1lGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIncKFUpTT05TY2hlbWFTaW1wbGVUeXBlcxILCgdVTktOT1dOEAASCQoFQVJSQVkQARILCgdCT09MRUFOEAISCwoHSU5URUdFUhADEggKBE5VTEwQBBIKCgZOVU1CRVIQBRIKCgZPQkpFQ1QQBhIKCgZTVFJJTkcQB0oECAEQAkoECAIQA0oECAQQBUoECBIQE0oECBMQFEoECBcQGEoECBsQHEoECBwQHUoECB0QHkoECB4QIkoECCUQKkoECCoQK0oECCsQLiLZAgoDVGFnEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYAyABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJeCgpleHRlbnNpb25zGAQgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASL3AQoTU2VjdXJpdHlEZWZpbml0aW9ucxJoCghzZWN1cml0eRgBIAMoCzJMLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnMuU2VjdXJpdHlFbnRyeVIIc2VjdXJpdHkadgoNU2VjdXJpdHlFbnRyeRIQCgNrZXkYASABKAlSA2tleRJPCgV2YWx1ZRgCIAEoCzI5LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lUgV2YWx1ZToCOAEi/wYKDlNlY3VyaXR5U2NoZW1lElIKBHR5cGUYASABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5UeXBlUgR0eXBlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhISCgRuYW1lGAMgASgJUgRuYW1lEkwKAmluGAQgASgOMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuSW5SAmluElIKBGZsb3cYBSABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5GbG93UgRmbG93EisKEWF1dGhvcml6YXRpb25fdXJsGAYgASgJUhBhdXRob3JpemF0aW9uVXJsEhsKCXRva2VuX3VybBgHIAEoCVIIdG9rZW5VcmwSSQoGc2NvcGVzGAggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzUgZzY29wZXMSaQoKZXh0ZW5zaW9ucxgJIAMoCzJJLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJLCgRUeXBlEhAKDFRZUEVfSU5WQUxJRBAAEg4KClRZUEVfQkFTSUMQARIQCgxUWVBFX0FQSV9LRVkQAhIPCgtUWVBFX09BVVRIMhADIjEKAkluEg4KCklOX0lOVkFMSUQQABIMCghJTl9RVUVSWRABEg0KCUlOX0hFQURFUhACImoKBEZsb3cSEAoMRkxPV19JTlZBTElEEAASEQoNRkxPV19JTVBMSUNJVBABEhEKDUZMT1dfUEFTU1dPUkQQAhIUChBGTE9XX0FQUExJQ0FUSU9OEAMSFAoQRkxPV19BQ0NFU1NfQ09ERRAEIvYCChNTZWN1cml0eVJlcXVpcmVtZW50EooBChRzZWN1cml0eV9yZXF1aXJlbWVudBgBIAMoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5UhNzZWN1cml0eVJlcXVpcmVtZW50GjAKGFNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZRIUCgVzY29wZRgBIAMoCVIFc2NvcGUanwEKGFNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRJtCgV2YWx1ZRgCIAEoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlUgV2YWx1ZToCOAEilgEKBlNjb3BlcxJSCgVzY29wZRgBIAMoCzI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blcy5TY29wZUVudHJ5UgVzY29wZRo4CgpTY29wZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEqOwoGU2NoZW1lEgsKB1VOS05PV04QABIICgRIVFRQEAESCQoFSFRUUFMQAhIGCgJXUxADEgcKA1dTUxAEQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr9BgoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvGixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bzp+ChFvcGVuYXBpdjJfc3dhZ2dlchIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiSCCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyUhBvcGVuYXBpdjJTd2FnZ2VyOoYBChNvcGVuYXBpdjJfb3BlcmF0aW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYkgggASgLMjQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uUhJvcGVuYXBpdjJPcGVyYXRpb246fgoQb3BlbmFwaXYyX3NjaGVtYRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiSCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSD29wZW5hcGl2MlNjaGVtYTp1Cg1vcGVuYXBpdjJfdGFnEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJIIIAEoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IMb3BlbmFwaXYyVGFnOn4KD29wZW5hcGl2Ml9maWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkgggASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIOb3BlbmFwaXYyRmllbGRCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCukBChZwcm90by9hdXRoL3Rva2VuLnByb3RvEg5idWNrZXRlZXIuYXV0aCKGAQoFVG9rZW4SIQoMYWNjZXNzX3Rva2VuGAEgASgJUgthY2Nlc3NUb2tlbhIdCgp0b2tlbl90eXBlGAIgASgJUgl0b2tlblR5cGUSIwoNcmVmcmVzaF90b2tlbhgDIAEoCVIMcmVmcmVzaFRva2VuEhYKBmV4cGlyeRgEIAEoA1IGZXhwaXJ5Qi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRoYgZwcm90bzMKuhoKGHByb3RvL2F1dGgvc2VydmljZS5wcm90bxIOYnVja2V0ZWVyLmF1dGgaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8aFnByb3RvL2F1dGgvdG9rZW4ucHJvdG8ihAEKG0dldEF1dGhlbnRpY2F0aW9uVVJMUmVxdWVzdBIUCgVzdGF0ZRgBIAEoCVIFc3RhdGUSIQoMcmVkaXJlY3RfdXJsGAIgASgJUgtyZWRpcmVjdFVybBIsCgR0eXBlGAMgASgOMhguYnVja2V0ZWVyLmF1dGguQXV0aFR5cGVSBHR5cGUiMAocR2V0QXV0aGVudGljYXRpb25VUkxSZXNwb25zZRIQCgN1cmwYASABKAlSA3VybCJ7ChRFeGNoYW5nZVRva2VuUmVxdWVzdBISCgRjb2RlGAEgASgJUgRjb2RlEiEKDHJlZGlyZWN0X3VybBgCIAEoCVILcmVkaXJlY3RVcmwSLAoEdHlwZRgDIAEoDjIYLmJ1Y2tldGVlci5hdXRoLkF1dGhUeXBlUgR0eXBlIkQKFUV4Y2hhbmdlVG9rZW5SZXNwb25zZRIrCgV0b2tlbhgBIAEoCzIVLmJ1Y2tldGVlci5hdXRoLlRva2VuUgV0b2tlbiI6ChNSZWZyZXNoVG9rZW5SZXF1ZXN0EiMKDXJlZnJlc2hfdG9rZW4YASABKAlSDHJlZnJlc2hUb2tlbiJDChRSZWZyZXNoVG9rZW5SZXNwb25zZRIrCgV0b2tlbhgBIAEoCzIVLmJ1Y2tldGVlci5hdXRoLlRva2VuUgV0b2tlbiJBCg1TaWduSW5SZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIaCghwYXNzd29yZBgCIAEoCVIIcGFzc3dvcmQiPQoOU2lnbkluUmVzcG9uc2USKwoFdG9rZW4YASABKAsyFS5idWNrZXRlZXIuYXV0aC5Ub2tlblIFdG9rZW4qcgoIQXV0aFR5cGUSGQoVQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASHwoXQVVUSF9UWVBFX1VTRVJfUEFTU1dPUkQQARoCCAESFAoQQVVUSF9UWVBFX0dPT0dMRRACEhQKEEFVVEhfVFlQRV9HSVRIVUIQAzL8EgoLQXV0aFNlcnZpY2USlAUKDUV4Y2hhbmdlVG9rZW4SJC5idWNrZXRlZXIuYXV0aC5FeGNoYW5nZVRva2VuUmVxdWVzdBolLmJ1Y2tldGVlci5hdXRoLkV4Y2hhbmdlVG9rZW5SZXNwb25zZSK1BJJBjwQKDkF1dGhlbnRpY2F0aW9uEg5FeGNoYW5nZSBUb2tlbhplRXhjaGFuZ2UgdGhlIHRva2VuIGZyb20gdGhlIE9BdXRoIHByb3ZpZGVyIHRvIHRoZSBCdWNrZXRlZXIgdG9rZW4uCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IEdvb2dsZS4qGndlYi52MS5hdXRoLmV4Y2hhbmdlX3Rva2VuSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHCIXL3YxL2F1dGgvZXhjaGFuZ2VfdG9rZW46ASoSsgQKFEdldEF1dGhlbnRpY2F0aW9uVVJMEisuYnVja2V0ZWVyLmF1dGguR2V0QXV0aGVudGljYXRpb25VUkxSZXF1ZXN0GiwuYnVja2V0ZWVyLmF1dGguR2V0QXV0aGVudGljYXRpb25VUkxSZXNwb25zZSK+A5JBlAMKDkF1dGhlbnRpY2F0aW9uEhZHZXQgQXV0aGVudGljYXRpb24gVVJMGpIBVGhlIE9BdXRoIGNyZWRlbnRpYWxzIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgc2VydmVyIHRvIGNhbGwgdGhpcyBBUEkuIEl0IHdpbGwgcmV0dXJuIHRoZSBBdXRoZW50aWNhdGlvbiBVUkwuCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IEdvb2dsZS4qHndlYi52MS5hdXRoLmF1dGhlbnRpY2F0aW9uX3VybEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfYLT5JMCICIbL3YxL2F1dGgvYXV0aGVudGljYXRpb25fdXJsOgEqEuMECgxSZWZyZXNoVG9rZW4SIy5idWNrZXRlZXIuYXV0aC5SZWZyZXNoVG9rZW5SZXF1ZXN0GiQuYnVja2V0ZWVyLmF1dGguUmVmcmVzaFRva2VuUmVzcG9uc2UihwSSQeIDCg5BdXRoZW50aWNhdGlvbhINUmVmcmVzaCBUb2tlbho6UmVmcmVzaCB0aGUgQnVja2V0ZWVyIHRva2VuIG1haW50YWluZWQgYnkgdGhlIHdlYiBjb25zb2xlLioZd2ViLnYxLmF1dGgucmVmcmVzaF90b2tlbkq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsiFi92MS9hdXRoL3JlZnJlc2hfdG9rZW46ASoSugQKBlNpZ25JbhIdLmJ1Y2tldGVlci5hdXRoLlNpZ25JblJlcXVlc3QaHi5idWNrZXRlZXIuYXV0aC5TaWduSW5SZXNwb25zZSLwA5JB0gMKDkF1dGhlbnRpY2F0aW9uEgdTaWduIEluGjdTaWduIGluIG9uIHRoZSB3ZWIgY29uc29sZSB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuKhJ3ZWIudjEuYXV0aC5zaWduaW5KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIUIg8vdjEvYXV0aC9zaWduaW46ASpCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dGhiBnByb3RvMw==
- notificationDescriptor: CvADCiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvEhZidWNrZXRlZXIubm90aWZpY2F0aW9uIrcCCglSZWNpcGllbnQSOgoEdHlwZRgBIAEoDjImLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50LlR5cGVSBHR5cGUSZQoXc2xhY2tfY2hhbm5lbF9yZWNpcGllbnQYAiABKAsyLS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlNsYWNrQ2hhbm5lbFJlY2lwaWVudFIVc2xhY2tDaGFubmVsUmVjaXBpZW50EkYKCGxhbmd1YWdlGAMgASgOMiouYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnQuTGFuZ3VhZ2VSCGxhbmd1YWdlIhgKBFR5cGUSEAoMU2xhY2tDaGFubmVsEAAiJQoITGFuZ3VhZ2USCwoHRU5HTElTSBAAEgwKCEpBUEFORVNFEAEiOAoVU2xhY2tDaGFubmVsUmVjaXBpZW50Eh8KC3dlYmhvb2tfdXJsGAEgASgJUgp3ZWJob29rVXJsQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ub3RpZmljYXRpb25iBnByb3RvMwrlCAolcHJvdG8vbm90aWZpY2F0aW9uL3N1YnNjcmlwdGlvbi5wcm90bxIWYnVja2V0ZWVyLm5vdGlmaWNhdGlvbhoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90byK/BwoMU3Vic2NyaXB0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpjcmVhdGVkX2F0GAIgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0EhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBJSCgxzb3VyY2VfdHlwZXMYBSADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYBiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYByABKAlSBG5hbWUSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWQSKQoQZW52aXJvbm1lbnRfbmFtZRgJIAEoCVIPZW52aXJvbm1lbnROYW1lIskECgpTb3VyY2VUeXBlEhgKFERPTUFJTl9FVkVOVF9GRUFUVVJFEAASFQoRRE9NQUlOX0VWRU5UX0dPQUwQARIbChdET01BSU5fRVZFTlRfRVhQRVJJTUVOVBACEhgKFERPTUFJTl9FVkVOVF9BQ0NPVU5UEAMSFwoTRE9NQUlOX0VWRU5UX0FQSUtFWRAEEhgKFERPTUFJTl9FVkVOVF9TRUdNRU5UEAUSHAoYRE9NQUlOX0VWRU5UX0VOVklST05NRU5UEAYSHgoaRE9NQUlOX0VWRU5UX0FETUlOX0FDQ09VTlQQBxIdChlET01BSU5fRVZFTlRfQVVUT09QU19SVUxFEAgSFQoRRE9NQUlOX0VWRU5UX1BVU0gQCRIdChlET01BSU5fRVZFTlRfU1VCU0NSSVBUSU9OEAoSIwofRE9NQUlOX0VWRU5UX0FETUlOX1NVQlNDUklQVElPThALEhgKFERPTUFJTl9FVkVOVF9QUk9KRUNUEAwSGAoURE9NQUlOX0VWRU5UX1dFQkhPT0sQDRIkCiBET01BSU5fRVZFTlRfUFJPR1JFU1NJVkVfUk9MTE9VVBAOEh0KGURPTUFJTl9FVkVOVF9PUkdBTklaQVRJT04QDxIdChlET01BSU5fRVZFTlRfRkxBR19UUklHR0VSEBASFAoQRE9NQUlOX0VWRU5UX1RBRxAREhEKDUZFQVRVUkVfU1RBTEUQZBIXChJFWFBFUklNRU5UX1JVTk5JTkcQyAESDgoJTUFVX0NPVU5UEKwCQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ub3RpZmljYXRpb25iBnByb3RvMwraCgogcHJvdG8vbm90aWZpY2F0aW9uL2NvbW1hbmQucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24aJXByb3RvL25vdGlmaWNhdGlvbi9zdWJzY3JpcHRpb24ucHJvdG8aInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8iyQEKHkNyZWF0ZUFkbWluU3Vic2NyaXB0aW9uQ29tbWFuZBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYAiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYAyABKAlSBG5hbWUifAomQWRkQWRtaW5TdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0NvbW1hbmQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMifwopRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0NvbW1hbmQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiIAoeRW5hYmxlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kIiEKH0Rpc2FibGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmQiIAoeRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kIjQKHlJlbmFtZUFkbWluU3Vic2NyaXB0aW9uQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIsQBChlDcmVhdGVTdWJzY3JpcHRpb25Db21tYW5kElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEj8KCXJlY2lwaWVudBgCIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50UglyZWNpcGllbnQSEgoEbmFtZRgDIAEoCVIEbmFtZSJrChVBZGRTb3VyY2VUeXBlc0NvbW1hbmQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMibgoYRGVsZXRlU291cmNlVHlwZXNDb21tYW5kElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIhsKGUVuYWJsZVN1YnNjcmlwdGlvbkNvbW1hbmQiHAoaRGlzYWJsZVN1YnNjcmlwdGlvbkNvbW1hbmQiGwoZRGVsZXRlU3Vic2NyaXB0aW9uQ29tbWFuZCIvChlSZW5hbWVTdWJzY3JpcHRpb25Db21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWVCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKhwUKFWdvb2dsZS9hcGkvaHR0cC5wcm90bxIKZ29vZ2xlLmFwaSJ5CgRIdHRwEioKBXJ1bGVzGAEgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIFcnVsZXMSRQofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCFIcZnVsbHlEZWNvZGVSZXNlcnZlZEV4cGFuc2lvbiK1AgoISHR0cFJ1bGUSGgoIc2VsZWN0b3IYASABKAlSCHNlbGVjdG9yEhIKA2dldBgCIAEoCUgAUgNnZXQSEgoDcHV0GAMgASgJSABSA3B1dBIUCgRwb3N0GAQgASgJSABSBHBvc3QSGAoGZGVsZXRlGAUgASgJSABSBmRlbGV0ZRIWCgVwYXRjaBgGIAEoCUgAUgVwYXRjaBI3CgZjdXN0b20YCCABKAsyHS5nb29nbGUuYXBpLkN1c3RvbUh0dHBQYXR0ZXJuSABSBmN1c3RvbRISCgRib2R5GAcgASgJUgRib2R5EkUKE2FkZGl0aW9uYWxfYmluZGluZ3MYCyADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUhJhZGRpdGlvbmFsQmluZGluZ3NCCQoHcGF0dGVybiI7ChFDdXN0b21IdHRwUGF0dGVybhISCgRraW5kGAEgASgJUgRraW5kEhIKBHBhdGgYAiABKAlSBHBhdGhCagoOY29tLmdvb2dsZS5hcGlCCUh0dHBQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc/gBAaICBEdBUEliBnByb3RvMwrhRgogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJNChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUi/gQKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSGAoHZWRpdGlvbhgNIAEoCVIHZWRpdGlvbiK5BgoPRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSOwoFZmllbGQYAiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SBWZpZWxkEkMKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEkEKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1IKbmVzdGVkVHlwZRJBCgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSWAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVIOZXh0ZW5zaW9uUmFuZ2USRAoKb25lb2ZfZGVjbBgIIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1IJb25lb2ZEZWNsEjkKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNSB29wdGlvbnMSVQoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgKIAMoCVIMcmVzZXJ2ZWROYW1lGnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKtBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhJoCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEUgx2ZXJpZmljYXRpb24aswEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIjCgtpc19yZXBlYXRlZBgEIAEoCEICGAFSCmlzUmVwZWF0ZWQSGgoIcmVzZXJ2ZWQYBSABKAhSCHJlc2VydmVkEhoKCHJlcGVhdGVkGAYgASgIUghyZXBlYXRlZCI0ChFWZXJpZmljYXRpb25TdGF0ZRIPCgtERUNMQVJBVElPThAAEg4KClVOVkVSSUZJRUQQASoJCOgHEICAgIACIsEGChRGaWVsZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgDIAEoBVIGbnVtYmVyEkEKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsUgVsYWJlbBI+CgR0eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSBHR5cGUSGwoJdHlwZV9uYW1lGAYgASgJUgh0eXBlTmFtZRIaCghleHRlbmRlZRgCIAEoCVIIZXh0ZW5kZWUSIwoNZGVmYXVsdF92YWx1ZRgHIAEoCVIMZGVmYXVsdFZhbHVlEh8KC29uZW9mX2luZGV4GAkgASgFUgpvbmVvZkluZGV4EhsKCWpzb25fbmFtZRgKIAEoCVIIanNvbk5hbWUSNwoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNSB29wdGlvbnMSJwoPcHJvdG8zX29wdGlvbmFsGBEgASgIUg5wcm90bzNPcHRpb25hbCK2AgoEVHlwZRIPCgtUWVBFX0RPVUJMRRABEg4KClRZUEVfRkxPQVQQAhIOCgpUWVBFX0lOVDY0EAMSDwoLVFlQRV9VSU5UNjQQBBIOCgpUWVBFX0lOVDMyEAUSEAoMVFlQRV9GSVhFRDY0EAYSEAoMVFlQRV9GSVhFRDMyEAcSDQoJVFlQRV9CT09MEAgSDwoLVFlQRV9TVFJJTkcQCRIOCgpUWVBFX0dST1VQEAoSEAoMVFlQRV9NRVNTQUdFEAsSDgoKVFlQRV9CWVRFUxAMEg8KC1RZUEVfVUlOVDMyEA0SDQoJVFlQRV9FTlVNEA4SEQoNVFlQRV9TRklYRUQzMhAPEhEKDVRZUEVfU0ZJWEVENjQQEBIPCgtUWVBFX1NJTlQzMhAREg8KC1RZUEVfU0lOVDY0EBIiQwoFTGFiZWwSEgoOTEFCRUxfT1BUSU9OQUwQARISCg5MQUJFTF9SRVFVSVJFRBACEhIKDkxBQkVMX1JFUEVBVEVEEAMiYwoUT25lb2ZEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI3CgdvcHRpb25zGAIgASgLMh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1IHb3B0aW9ucyLjAgoTRW51bURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj8KBXZhbHVlGAIgAygLMikuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1IFdmFsdWUSNgoHb3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1IHb3B0aW9ucxJdCg5yZXNlcnZlZF9yYW5nZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYBSADKAlSDHJlc2VydmVkTmFtZRo7ChFFbnVtUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQigwEKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgCIAEoBVIGbnVtYmVyEjsKB29wdGlvbnMYAyABKAsyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1IHb3B0aW9ucyKnAQoWU2VydmljZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj4KBm1ldGhvZBgCIAMoCzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9SBm1ldGhvZBI5CgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zUgdvcHRpb25zIokCChVNZXRob2REZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIdCgppbnB1dF90eXBlGAIgASgJUglpbnB1dFR5cGUSHwoLb3V0cHV0X3R5cGUYAyABKAlSCm91dHB1dFR5cGUSOAoHb3B0aW9ucxgEIAEoCzIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zUgdvcHRpb25zEjAKEGNsaWVudF9zdHJlYW1pbmcYBSABKAg6BWZhbHNlUg9jbGllbnRTdHJlYW1pbmcSMAoQc2VydmVyX3N0cmVhbWluZxgGIAEoCDoFZmFsc2VSD3NlcnZlclN0cmVhbWluZyKRCQoLRmlsZU9wdGlvbnMSIQoMamF2YV9wYWNrYWdlGAEgASgJUgtqYXZhUGFja2FnZRIwChRqYXZhX291dGVyX2NsYXNzbmFtZRgIIAEoCVISamF2YU91dGVyQ2xhc3NuYW1lEjUKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlUhFqYXZhTXVsdGlwbGVGaWxlcxJECh1qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaBgUIAEoCEICGAFSGWphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gSOgoWamF2YV9zdHJpbmdfY2hlY2tfdXRmOBgbIAEoCDoFZmFsc2VSE2phdmFTdHJpbmdDaGVja1V0ZjgSUwoMb3B0aW1pemVfZm9yGAkgASgOMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZToFU1BFRURSC29wdGltaXplRm9yEh0KCmdvX3BhY2thZ2UYCyABKAlSCWdvUGFja2FnZRI1ChNjY19nZW5lcmljX3NlcnZpY2VzGBAgASgIOgVmYWxzZVIRY2NHZW5lcmljU2VydmljZXMSOQoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZVITamF2YUdlbmVyaWNTZXJ2aWNlcxI1ChNweV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZVIRcHlHZW5lcmljU2VydmljZXMSNwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZhbHNlUhJwaHBHZW5lcmljU2VydmljZXMSJQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSLgoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoEdHJ1ZVIOY2NFbmFibGVBcmVuYXMSKgoRb2JqY19jbGFzc19wcmVmaXgYJCABKAlSD29iamNDbGFzc1ByZWZpeBIpChBjc2hhcnBfbmFtZXNwYWNlGCUgASgJUg9jc2hhcnBOYW1lc3BhY2USIQoMc3dpZnRfcHJlZml4GCcgASgJUgtzd2lmdFByZWZpeBIoChBwaHBfY2xhc3NfcHJlZml4GCggASgJUg5waHBDbGFzc1ByZWZpeBIjCg1waHBfbmFtZXNwYWNlGCkgASgJUgxwaHBOYW1lc3BhY2USNAoWcGhwX21ldGFkYXRhX25hbWVzcGFjZRgsIAEoCVIUcGhwTWV0YWRhdGFOYW1lc3BhY2USIQoMcnVieV9wYWNrYWdlGC0gASgJUgtydWJ5UGFja2FnZRJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiI6CgxPcHRpbWl6ZU1vZGUSCQoFU1BFRUQQARINCglDT0RFX1NJWkUQAhIQCgxMSVRFX1JVTlRJTUUQAyoJCOgHEICAgIACSgQIJhAnIrsDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoihQkKDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSgoGdGFyZ2V0GBIgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlQgIYAVIGdGFyZ2V0EkgKB3RhcmdldHMYEyADKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVSB3RhcmdldHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iLwoFQ1R5cGUSCgoGU1RSSU5HEAASCAoEQ09SRBABEhAKDFNUUklOR19QSUVDRRACIjUKBkpTVHlwZRINCglKU19OT1JNQUwQABINCglKU19TVFJJTkcQARINCglKU19OVU1CRVIQAiJVCg9PcHRpb25SZXRlbnRpb24SFQoRUkVURU5USU9OX1VOS05PV04QABIVChFSRVRFTlRJT05fUlVOVElNRRABEhQKEFJFVEVOVElPTl9TT1VSQ0UQAiKMAgoQT3B0aW9uVGFyZ2V0VHlwZRIXChNUQVJHRVRfVFlQRV9VTktOT1dOEAASFAoQVEFSR0VUX1RZUEVfRklMRRABEh8KG1RBUkdFVF9UWVBFX0VYVEVOU0lPTl9SQU5HRRACEhcKE1RBUkdFVF9UWVBFX01FU1NBR0UQAxIVChFUQVJHRVRfVFlQRV9GSUVMRBAEEhUKEVRBUkdFVF9UWVBFX09ORU9GEAUSFAoQVEFSR0VUX1RZUEVfRU5VTRAGEhoKFlRBUkdFVF9UWVBFX0VOVU1fRU5UUlkQBxIXChNUQVJHRVRfVFlQRV9TRVJWSUNFEAgSFgoSVEFSR0VUX1RZUEVfTUVUSE9EEAkqCQjoBxCAgICAAkoECAQQBSJzCgxPbmVvZk9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKYAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYingEKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKcAQoOU2VydmljZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLgAgoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnAgoOU291cmNlQ29kZUluZm8SRAoIbG9jYXRpb24YASADKAsyKC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25SCGxvY2F0aW9uGs4BCghMb2NhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIWCgRzcGFuGAIgAygFQgIQAVIEc3BhbhIpChBsZWFkaW5nX2NvbW1lbnRzGAMgASgJUg9sZWFkaW5nQ29tbWVudHMSKwoRdHJhaWxpbmdfY29tbWVudHMYBCABKAlSEHRyYWlsaW5nQ29tbWVudHMSOgoZbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cxgGIAMoCVIXbGVhZGluZ0RldGFjaGVkQ29tbWVudHMi0AIKEUdlbmVyYXRlZENvZGVJbmZvEk0KCmFubm90YXRpb24YASADKAsyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvblIKYW5ub3RhdGlvbhrrAQoKQW5ub3RhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIfCgtzb3VyY2VfZmlsZRgCIAEoCVIKc291cmNlRmlsZRIUCgViZWdpbhgDIAEoBVIFYmVnaW4SEAoDZW5kGAQgASgFUgNlbmQSUgoIc2VtYW50aWMYBSABKA4yNi5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5TZW1hbnRpY1IIc2VtYW50aWMiKAoIU2VtYW50aWMSCAoETk9ORRAAEgcKA1NFVBABEgkKBUFMSUFTEAJCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIQRGVzY3JpcHRvclByb3Rvc0gBWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGL4AQGiAgNHUEKqAhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgqoAgocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxIKZ29vZ2xlLmFwaRoVZ29vZ2xlL2FwaS9odHRwLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzpLCgRodHRwEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYsMq8IiABKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgRodHRwQm4KDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwqZTwogcHJvdG8vbm90aWZpY2F0aW9uL3NlcnZpY2UucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxofZ29vZ2xlL2FwaS9maWVsZF9iZWhhdmlvci5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxolcHJvdG8vbm90aWZpY2F0aW9uL3N1YnNjcmlwdGlvbi5wcm90bxoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90bxogcHJvdG8vbm90aWZpY2F0aW9uL2NvbW1hbmQucHJvdG8iLQobR2V0QWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCJoChxHZXRBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlEkgKDHN1YnNjcmlwdGlvbhgBIAEoCzIkLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24itwQKHUxpc3RBZG1pblN1YnNjcmlwdGlvbnNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISUgoMc291cmNlX3R5cGVzGAMgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSWAoIb3JkZXJfYnkYBCABKA4yPS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RBZG1pblN1YnNjcmlwdGlvbnNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSbQoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMkQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0QWRtaW5TdWJzY3JpcHRpb25zUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZCJACgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAyIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEipQEKHkxpc3RBZG1pblN1YnNjcmlwdGlvbnNSZXNwb25zZRJKCg1zdWJzY3JpcHRpb25zGAEgAygLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDXN1YnNjcmlwdGlvbnMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQirwEKJExpc3RFbmFibGVkQWRtaW5TdWJzY3JpcHRpb25zUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yElIKDHNvdXJjZV90eXBlcxgDIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIosBCiVMaXN0RW5hYmxlZEFkbWluU3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkoKDXN1YnNjcmlwdGlvbnMYASADKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblINc3Vic2NyaXB0aW9ucxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvciJyCh5DcmVhdGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QSUAoHY29tbWFuZBgBIAEoCzI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kUgdjb21tYW5kIiEKH0NyZWF0ZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UiggEKHkRlbGV0ZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSUAoHY29tbWFuZBgCIAEoCzI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kUgdjb21tYW5kIiEKH0RlbGV0ZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UiggEKHkVuYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSUAoHY29tbWFuZBgCIAEoCzI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRW5hYmxlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kUgdjb21tYW5kIiEKH0VuYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UihAEKH0Rpc2FibGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QSDgoCaWQYASABKAlSAmlkElEKB2NvbW1hbmQYAiABKAsyNy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmRSB2NvbW1hbmQiIgogRGlzYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UipAMKHlVwZGF0ZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSdwoYYWRkX3NvdXJjZV90eXBlc19jb21tYW5kGAIgASgLMj4uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5BZGRBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQ29tbWFuZFIVYWRkU291cmNlVHlwZXNDb21tYW5kEoABChtkZWxldGVfc291cmNlX3R5cGVzX2NvbW1hbmQYAyABKAsyQS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRlbGV0ZUFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNDb21tYW5kUhhkZWxldGVTb3VyY2VUeXBlc0NvbW1hbmQSdgobcmVuYW1lX3N1YnNjcmlwdGlvbl9jb21tYW5kGAQgASgLMjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZW5hbWVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmRSGXJlbmFtZVN1YnNjcmlwdGlvbkNvbW1hbmQiIQofVXBkYXRlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSJfChZHZXRTdWJzY3JpcHRpb25SZXF1ZXN0EhMKAmlkGAIgASgJQgPgQQJSAmlkEioKDmVudmlyb25tZW50X2lkGAMgASgJQgPgQQJSDWVudmlyb25tZW50SWRKBAgBEAIiYwoXR2V0U3Vic2NyaXB0aW9uUmVzcG9uc2USSAoMc3Vic2NyaXB0aW9uGAEgASgLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbiKfBQoYTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISUgoMc291cmNlX3R5cGVzGAQgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSUwoIb3JkZXJfYnkYBSABKA4yOC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RTdWJzY3JpcHRpb25zUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmgKD29yZGVyX2RpcmVjdGlvbhgGIAEoDjI/LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgHIAEoCVINc2VhcmNoS2V5d29yZBI2CghkaXNhYmxlZBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkEiUKDmVudmlyb25tZW50X2lkGAkgASgJUg1lbnZpcm9ubWVudElkEiwKD29yZ2FuaXphdGlvbl9pZBgKIAEoCUID4EECUg5vcmdhbml6YXRpb25JZCJcCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIPCgtFTlZJUk9OTUVOVBAEEgkKBVNUQVRFEAUiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIARACIqABChlMaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkoKDXN1YnNjcmlwdGlvbnMYASADKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblINc3Vic2NyaXB0aW9ucxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCLXAQofTGlzdEVuYWJsZWRTdWJzY3JpcHRpb25zUmVxdWVzdBIbCglwYWdlX3NpemUYAiABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgDIAEoCVIGY3Vyc29yElIKDHNvdXJjZV90eXBlcxgEIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIARACIoYBCiBMaXN0RW5hYmxlZFN1YnNjcmlwdGlvbnNSZXNwb25zZRJKCg1zdWJzY3JpcHRpb25zGAEgAygLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDXN1YnNjcmlwdGlvbnMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3Ii1gIKGUNyZWF0ZVN1YnNjcmlwdGlvblJlcXVlc3QSTwoHY29tbWFuZBgCIAEoCzIxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uQ3JlYXRlU3Vic2NyaXB0aW9uQ29tbWFuZEICGAFSB2NvbW1hbmQSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZBIXCgRuYW1lGAQgASgJQgPgQQJSBG5hbWUSVwoMc291cmNlX3R5cGVzGAUgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZUID4EECUgtzb3VyY2VUeXBlcxJECglyZWNpcGllbnQYBiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudEID4EECUglyZWNpcGllbnRKBAgBEAIiZgoaQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2USSAoMc3Vic2NyaXB0aW9uGAEgASgLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbiKpAQoZRGVsZXRlU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSTwoHY29tbWFuZBgDIAEoCzIxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlU3Vic2NyaXB0aW9uQ29tbWFuZEICGAFSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiHAoaRGVsZXRlU3Vic2NyaXB0aW9uUmVzcG9uc2UipQEKGUVuYWJsZVN1YnNjcmlwdGlvblJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEksKB2NvbW1hbmQYAyABKAsyMS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkVuYWJsZVN1YnNjcmlwdGlvbkNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiHAoaRW5hYmxlU3Vic2NyaXB0aW9uUmVzcG9uc2UipwEKGkRpc2FibGVTdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBJMCgdjb21tYW5kGAMgASgLMjIuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EaXNhYmxlU3Vic2NyaXB0aW9uQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIdChtEaXNhYmxlU3Vic2NyaXB0aW9uUmVzcG9uc2UivAYKGVVwZGF0ZVN1YnNjcmlwdGlvblJlcXVlc3QSEwoCaWQYAiABKAlCA+BBAlICaWQSlAEKGGFkZF9zb3VyY2VfdHlwZXNfY29tbWFuZBgDIAEoCzItLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uQWRkU291cmNlVHlwZXNDb21tYW5kQiwYAZJBJzIlZGVwcmVjYXRlZC4gdXNlIHNvdXJjZV90eXBlcyBpbnN0ZWFkLlIVYWRkU291cmNlVHlwZXNDb21tYW5kEp0BChtkZWxldGVfc291cmNlX3R5cGVzX2NvbW1hbmQYBCABKAsyMC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRlbGV0ZVNvdXJjZVR5cGVzQ29tbWFuZEIsGAGSQScyJWRlcHJlY2F0ZWQuIHVzZSBzb3VyY2VfdHlwZXMgaW5zdGVhZC5SGGRlbGV0ZVNvdXJjZVR5cGVzQ29tbWFuZBKXAQobcmVuYW1lX3N1YnNjcmlwdGlvbl9jb21tYW5kGAUgASgLMjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZW5hbWVTdWJzY3JpcHRpb25Db21tYW5kQiQYAZJBHzIdZGVwcmVjYXRlZC4gdXNlIG5hbWUgaW5zdGVhZC5SGXJlbmFtZVN1YnNjcmlwdGlvbkNvbW1hbmQSKgoOZW52aXJvbm1lbnRfaWQYBiABKAlCA+BBAlINZW52aXJvbm1lbnRJZBJSCgxzb3VyY2VfdHlwZXMYByADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxIwCgRuYW1lGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEoABCghkaXNhYmxlZBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVCSJJBRSoIZGlzYWJsZWQyOWlmIHRydWUsIHRoZSBzdWJzY3JpcHRpb24gaXMgZGlzYWJsZWQsIG90aGVyd2lzZSBlbmFibGVkLlIIZGlzYWJsZWRKBAgBEAIiZgoaVXBkYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2USSAoMc3Vic2NyaXB0aW9uGAEgASgLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbjLaHwoTTm90aWZpY2F0aW9uU2VydmljZRKDAQoUR2V0QWRtaW5TdWJzY3JpcHRpb24SMy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkdldEFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBo0LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uR2V0QWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSIAEokBChZMaXN0QWRtaW5TdWJzY3JpcHRpb25zEjUuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0QWRtaW5TdWJzY3JpcHRpb25zUmVxdWVzdBo2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdEFkbWluU3Vic2NyaXB0aW9uc1Jlc3BvbnNlIgASngEKHUxpc3RFbmFibGVkQWRtaW5TdWJzY3JpcHRpb25zEjwuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0RW5hYmxlZEFkbWluU3Vic2NyaXB0aW9uc1JlcXVlc3QaPS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RFbmFibGVkQWRtaW5TdWJzY3JpcHRpb25zUmVzcG9uc2UiABKMAQoXQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb24SNi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkNyZWF0ZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBo3LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSIAEowBChdEZWxldGVBZG1pblN1YnNjcmlwdGlvbhI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0GjcuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIgASjAEKF0VuYWJsZUFkbWluU3Vic2NyaXB0aW9uEjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5FbmFibGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QaNy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkVuYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UiABKPAQoYRGlzYWJsZUFkbWluU3Vic2NyaXB0aW9uEjcuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EaXNhYmxlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0GjguYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EaXNhYmxlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSIAEowBChdVcGRhdGVBZG1pblN1YnNjcmlwdGlvbhI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uVXBkYXRlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0GjcuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5VcGRhdGVBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIgASvAQKD0dldFN1YnNjcmlwdGlvbhIuLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uR2V0U3Vic2NyaXB0aW9uUmVxdWVzdBovLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uR2V0U3Vic2NyaXB0aW9uUmVzcG9uc2UixwOSQasDCgxzdWJzY3JpcHRpb24SA0dldBoRR2V0IHN1YnNjcmlwdGlvbi4qF3dlYi52MS5zdWJzY3JpcHRpb24uZ2V0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCEhIQL3YxL3N1YnNjcmlwdGlvbhLHBAoRTGlzdFN1YnNjcmlwdGlvbnMSMC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RTdWJzY3JpcHRpb25zUmVxdWVzdBoxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdFN1YnNjcmlwdGlvbnNSZXNwb25zZSLMA5JBrwMKDHN1YnNjcmlwdGlvbhIETGlzdBoTTGlzdCBzdWJzY3JpcHRpb25zLioYd2ViLnYxLnN1YnNjcmlwdGlvbi5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCExIRL3YxL3N1YnNjcmlwdGlvbnMSjwEKGExpc3RFbmFibGVkU3Vic2NyaXB0aW9ucxI3LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdEVuYWJsZWRTdWJzY3JpcHRpb25zUmVxdWVzdBo4LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdEVuYWJsZWRTdWJzY3JpcHRpb25zUmVzcG9uc2UiABLRBAoSQ3JlYXRlU3Vic2NyaXB0aW9uEjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5DcmVhdGVTdWJzY3JpcHRpb25SZXF1ZXN0GjIuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5DcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZSLTA5JBtAMKDHN1YnNjcmlwdGlvbhIGQ3JlYXRlGhRDcmVhdGUgc3Vic2NyaXB0aW9uLioad2ViLnYxLnN1YnNjcmlwdGlvbi5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIVIhAvdjEvc3Vic2NyaXB0aW9uOgEqEn0KEkRlbGV0ZVN1YnNjcmlwdGlvbhIxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlU3Vic2NyaXB0aW9uUmVxdWVzdBoyLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlU3Vic2NyaXB0aW9uUmVzcG9uc2UiABJ9ChJFbmFibGVTdWJzY3JpcHRpb24SMS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkVuYWJsZVN1YnNjcmlwdGlvblJlcXVlc3QaMi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkVuYWJsZVN1YnNjcmlwdGlvblJlc3BvbnNlIgASgAEKE0Rpc2FibGVTdWJzY3JpcHRpb24SMi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVTdWJzY3JpcHRpb25SZXF1ZXN0GjMuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EaXNhYmxlU3Vic2NyaXB0aW9uUmVzcG9uc2UiABLRBAoSVXBkYXRlU3Vic2NyaXB0aW9uEjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5VcGRhdGVTdWJzY3JpcHRpb25SZXF1ZXN0GjIuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5VcGRhdGVTdWJzY3JpcHRpb25SZXNwb25zZSLTA5JBtAMKDHN1YnNjcmlwdGlvbhIGVXBkYXRlGhRVcGRhdGUgc3Vic2NyaXB0aW9uLioad2ViLnYxLnN1YnNjcmlwdGlvbi51cGRhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIVMhAvdjEvc3Vic2NyaXB0aW9uOgEqQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ub3RpZmljYXRpb25iBnByb3RvMw==
+ notificationDescriptor: CvADCiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvEhZidWNrZXRlZXIubm90aWZpY2F0aW9uIrcCCglSZWNpcGllbnQSOgoEdHlwZRgBIAEoDjImLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50LlR5cGVSBHR5cGUSZQoXc2xhY2tfY2hhbm5lbF9yZWNpcGllbnQYAiABKAsyLS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlNsYWNrQ2hhbm5lbFJlY2lwaWVudFIVc2xhY2tDaGFubmVsUmVjaXBpZW50EkYKCGxhbmd1YWdlGAMgASgOMiouYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnQuTGFuZ3VhZ2VSCGxhbmd1YWdlIhgKBFR5cGUSEAoMU2xhY2tDaGFubmVsEAAiJQoITGFuZ3VhZ2USCwoHRU5HTElTSBAAEgwKCEpBUEFORVNFEAEiOAoVU2xhY2tDaGFubmVsUmVjaXBpZW50Eh8KC3dlYmhvb2tfdXJsGAEgASgJUgp3ZWJob29rVXJsQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ub3RpZmljYXRpb25iBnByb3RvMwr/CAolcHJvdG8vbm90aWZpY2F0aW9uL3N1YnNjcmlwdGlvbi5wcm90bxIWYnVja2V0ZWVyLm5vdGlmaWNhdGlvbhoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90byLZBwoMU3Vic2NyaXB0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpjcmVhdGVkX2F0GAIgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0EhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBJSCgxzb3VyY2VfdHlwZXMYBSADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYBiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYByABKAlSBG5hbWUSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWQSKQoQZW52aXJvbm1lbnRfbmFtZRgJIAEoCVIPZW52aXJvbm1lbnROYW1lIuMECgpTb3VyY2VUeXBlEhgKFERPTUFJTl9FVkVOVF9GRUFUVVJFEAASFQoRRE9NQUlOX0VWRU5UX0dPQUwQARIbChdET01BSU5fRVZFTlRfRVhQRVJJTUVOVBACEhgKFERPTUFJTl9FVkVOVF9BQ0NPVU5UEAMSFwoTRE9NQUlOX0VWRU5UX0FQSUtFWRAEEhgKFERPTUFJTl9FVkVOVF9TRUdNRU5UEAUSHAoYRE9NQUlOX0VWRU5UX0VOVklST05NRU5UEAYSHgoaRE9NQUlOX0VWRU5UX0FETUlOX0FDQ09VTlQQBxIdChlET01BSU5fRVZFTlRfQVVUT09QU19SVUxFEAgSFQoRRE9NQUlOX0VWRU5UX1BVU0gQCRIdChlET01BSU5fRVZFTlRfU1VCU0NSSVBUSU9OEAoSIwofRE9NQUlOX0VWRU5UX0FETUlOX1NVQlNDUklQVElPThALEhgKFERPTUFJTl9FVkVOVF9QUk9KRUNUEAwSGAoURE9NQUlOX0VWRU5UX1dFQkhPT0sQDRIkCiBET01BSU5fRVZFTlRfUFJPR1JFU1NJVkVfUk9MTE9VVBAOEh0KGURPTUFJTl9FVkVOVF9PUkdBTklaQVRJT04QDxIdChlET01BSU5fRVZFTlRfRkxBR19UUklHR0VSEBASFAoQRE9NQUlOX0VWRU5UX1RBRxAREhgKFERPTUFJTl9FVkVOVF9DT0RFUkVGEBISEQoNRkVBVFVSRV9TVEFMRRBkEhcKEkVYUEVSSU1FTlRfUlVOTklORxDIARIOCglNQVVfQ09VTlQQrAJCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCtoKCiBwcm90by9ub3RpZmljYXRpb24vY29tbWFuZC5wcm90bxIWYnVja2V0ZWVyLm5vdGlmaWNhdGlvbholcHJvdG8vbm90aWZpY2F0aW9uL3N1YnNjcmlwdGlvbi5wcm90bxoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90byLJAQoeQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEj8KCXJlY2lwaWVudBgCIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50UglyZWNpcGllbnQSEgoEbmFtZRgDIAEoCVIEbmFtZSJ8CiZBZGRBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQ29tbWFuZBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJ/CilEZWxldGVBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQ29tbWFuZBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyIgCh5FbmFibGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmQiIQofRGlzYWJsZUFkbWluU3Vic2NyaXB0aW9uQ29tbWFuZCIgCh5EZWxldGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmQiNAoeUmVuYW1lQWRtaW5TdWJzY3JpcHRpb25Db21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUixAEKGUNyZWF0ZVN1YnNjcmlwdGlvbkNvbW1hbmQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAIgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAMgASgJUgRuYW1lImsKFUFkZFNvdXJjZVR5cGVzQ29tbWFuZBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJuChhEZWxldGVTb3VyY2VUeXBlc0NvbW1hbmQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiGwoZRW5hYmxlU3Vic2NyaXB0aW9uQ29tbWFuZCIcChpEaXNhYmxlU3Vic2NyaXB0aW9uQ29tbWFuZCIbChlEZWxldGVTdWJzY3JpcHRpb25Db21tYW5kIi8KGVJlbmFtZVN1YnNjcmlwdGlvbkNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vbm90aWZpY2F0aW9uYgZwcm90bzMKhgQKHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIiMKC0RvdWJsZVZhbHVlEhQKBXZhbHVlGAEgASgBUgV2YWx1ZSIiCgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZSIiCgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZSIjCgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWUiIgoKSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWUiIwoLVUludDMyVmFsdWUSFAoFdmFsdWUYASABKA1SBXZhbHVlIiEKCUJvb2xWYWx1ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWUiIwoLU3RyaW5nVmFsdWUSFAoFdmFsdWUYASABKAlSBXZhbHVlIiIKCkJ5dGVzVmFsdWUSFAoFdmFsdWUYASABKAxSBXZhbHVlQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqHBQoVZ29vZ2xlL2FwaS9odHRwLnByb3RvEgpnb29nbGUuYXBpInkKBEh0dHASKgoFcnVsZXMYASADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgVydWxlcxJFCh9mdWxseV9kZWNvZGVfcmVzZXJ2ZWRfZXhwYW5zaW9uGAIgASgIUhxmdWxseURlY29kZVJlc2VydmVkRXhwYW5zaW9uIrUCCghIdHRwUnVsZRIaCghzZWxlY3RvchgBIAEoCVIIc2VsZWN0b3ISEgoDZ2V0GAIgASgJSABSA2dldBISCgNwdXQYAyABKAlIAFIDcHV0EhQKBHBvc3QYBCABKAlIAFIEcG9zdBIYCgZkZWxldGUYBSABKAlIAFIGZGVsZXRlEhYKBXBhdGNoGAYgASgJSABSBXBhdGNoEjcKBmN1c3RvbRgIIAEoCzIdLmdvb2dsZS5hcGkuQ3VzdG9tSHR0cFBhdHRlcm5IAFIGY3VzdG9tEhIKBGJvZHkYByABKAlSBGJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8zCuFGCiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIk0KEUZpbGVEZXNjcmlwdG9yU2V0EjgKBGZpbGUYASADKAsyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1IEZmlsZSL+BAoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIYCgdlZGl0aW9uGA0gASgJUgdlZGl0aW9uIrkGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUaegoORXh0ZW5zaW9uUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kEkAKB29wdGlvbnMYAyABKAsyJi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zUgdvcHRpb25zGjcKDVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIq0EChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24SWQoLZGVjbGFyYXRpb24YAiADKAsyMi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uQgOIAQJSC2RlY2xhcmF0aW9uEmgKDHZlcmlmaWNhdGlvbhgDIAEoDjI4Lmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGU6ClVOVkVSSUZJRURSDHZlcmlmaWNhdGlvbhqzAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEiMKC2lzX3JlcGVhdGVkGAQgASgIQgIYAVIKaXNSZXBlYXRlZBIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFURUQQAyJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIpEJCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxI3ChRwaHBfZ2VuZXJpY19zZXJ2aWNlcxgqIAEoCDoFZmFsc2VSEnBocEdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECciuwMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKFCQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJKCgZ0YXJnZXQYEiABKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVCAhgBUgZ0YXJnZXQSSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFInMKDE9uZW9mT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpgCCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLQAgoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGusBCgpBbm5vdGF0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEh8KC3NvdXJjZV9maWxlGAIgASgJUgpzb3VyY2VGaWxlEhQKBWJlZ2luGAMgASgFUgViZWdpbhIQCgNlbmQYBCABKAVSA2VuZBJSCghzZW1hbnRpYxgFIAEoDjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLlNlbWFudGljUghzZW1hbnRpYyIoCghTZW1hbnRpYxIICgROT05FEAASBwoDU0VUEAESCQoFQUxJQVMQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCqgCChxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpGhVnb29nbGUvYXBpL2h0dHAucHJvdG8aIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK6AMKH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8SCmdvb2dsZS5hcGkaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvKrYBCg1GaWVsZEJlaGF2aW9yEh4KGkZJRUxEX0JFSEFWSU9SX1VOU1BFQ0lGSUVEEAASDAoIT1BUSU9OQUwQARIMCghSRVFVSVJFRBACEg8KC09VVFBVVF9PTkxZEAMSDgoKSU5QVVRfT05MWRAEEg0KCUlNTVVUQUJMRRAFEhIKDlVOT1JERVJFRF9MSVNUEAYSFQoRTk9OX0VNUFRZX0RFRkFVTFQQBxIOCgpJREVOVElGSUVSEAg6ZAoOZmllbGRfYmVoYXZpb3ISHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJwIIAMoDjIZLmdvb2dsZS5hcGkuRmllbGRCZWhhdmlvckICEABSDWZpZWxkQmVoYXZpb3JCcAoOY29tLmdvb2dsZS5hcGlCEkZpZWxkQmVoYXZpb3JQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwriBQocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIpgBCgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEisgIKBVZhbHVlEjsKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSABSCW51bGxWYWx1ZRIjCgxudW1iZXJfdmFsdWUYAiABKAFIAFILbnVtYmVyVmFsdWUSIwoMc3RyaW5nX3ZhbHVlGAMgASgJSABSC3N0cmluZ1ZhbHVlEh8KCmJvb2xfdmFsdWUYBCABKAhIAFIJYm9vbFZhbHVlEjwKDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAFILc3RydWN0VmFsdWUSOwoKbGlzdF92YWx1ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIAFIJbGlzdFZhbHVlQgYKBGtpbmQiOwoJTGlzdFZhbHVlEi4KBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIGdmFsdWVzKhsKCU51bGxWYWx1ZRIOCgpOVUxMX1ZBTFVFEABCfwoTY29tLmdvb2dsZS5wcm90b2J1ZkILU3RydWN0UHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqmPgoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIrMICgdTd2FnZ2VyEhgKB3N3YWdnZXIYASABKAlSB3N3YWdnZXISQwoEaW5mbxgCIAEoCzIvLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm9SBGluZm8SEgoEaG9zdBgDIAEoCVIEaG9zdBIbCgliYXNlX3BhdGgYBCABKAlSCGJhc2VQYXRoEksKB3NjaGVtZXMYBSADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJfCglyZXNwb25zZXMYCiADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMScQoUc2VjdXJpdHlfZGVmaW5pdGlvbnMYCyABKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zUhNzZWN1cml0eURlZmluaXRpb25zEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSQgoEdGFncxgNIAMoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IEdGFncxJlCg1leHRlcm5hbF9kb2NzGA4gASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSYgoKZXh0ZW5zaW9ucxgPIAMoCzJCLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCUoECAkQCiLWBwoJT3BlcmF0aW9uEhIKBHRhZ3MYASADKAlSBHRhZ3MSGAoHc3VtbWFyeRgCIAEoCVIHc3VtbWFyeRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgEIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEiEKDG9wZXJhdGlvbl9pZBgFIAEoCVILb3BlcmF0aW9uSWQSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJhCglyZXNwb25zZXMYCSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJLCgdzY2hlbWVzGAogAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEh4KCmRlcHJlY2F0ZWQYCyABKAhSCmRlcHJlY2F0ZWQSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJkCgpleHRlbnNpb25zGA0gAygLMkQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxJVCgpwYXJhbWV0ZXJzGA4gASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUGFyYW1ldGVyc1IKcGFyYW1ldGVycxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAkiYgoKUGFyYW1ldGVycxJUCgdoZWFkZXJzGAEgAygLMjouZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyUgdoZWFkZXJzIqMCCg9IZWFkZXJQYXJhbWV0ZXISEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SUwoEdHlwZRgDIAEoDjI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlci5UeXBlUgR0eXBlEhYKBmZvcm1hdBgEIAEoCVIGZm9ybWF0EhoKCHJlcXVpcmVkGAUgASgIUghyZXF1aXJlZCJFCgRUeXBlEgsKB1VOS05PV04QABIKCgZTVFJJTkcQARIKCgZOVU1CRVIQAhILCgdJTlRFR0VSEAMSCwoHQk9PTEVBThAESgQIBhAHSgQIBxAIItgBCgZIZWFkZXISIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhIKBHR5cGUYAiABKAlSBHR5cGUSFgoGZm9ybWF0GAMgASgJUgZmb3JtYXQSGAoHZGVmYXVsdBgGIAEoCVIHZGVmYXVsdBIYCgdwYXR0ZXJuGA0gASgJUgdwYXR0ZXJuSgQIBBAFSgQIBRAGSgQIBxAISgQICBAJSgQICRAKSgQIChALSgQICxAMSgQIDBANSgQIDhAPSgQIDxAQSgQIEBARSgQIERASSgQIEhATIpoFCghSZXNwb25zZRIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SSQoGc2NoZW1hGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUgZzY2hlbWESWgoHaGVhZGVycxgDIAMoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxJdCghleGFtcGxlcxgEIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4YW1wbGVzRW50cnlSCGV4YW1wbGVzEmMKCmV4dGVuc2lvbnMYBSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMabQoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkcKBXZhbHVlGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUgV2YWx1ZToCOAEaOwoNRXhhbXBsZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBItYDCgRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SKAoQdGVybXNfb2Zfc2VydmljZRgDIAEoCVIOdGVybXNPZlNlcnZpY2USTAoHY29udGFjdBgEIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkNvbnRhY3RSB2NvbnRhY3QSTAoHbGljZW5zZRgFIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkxpY2Vuc2VSB2xpY2Vuc2USGAoHdmVyc2lvbhgGIAEoCVIHdmVyc2lvbhJfCgpleHRlbnNpb25zGAcgAygLMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mby5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiRQoHQ29udGFjdBISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsEhQKBWVtYWlsGAMgASgJUgVlbWFpbCIvCgdMaWNlbnNlEhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwiSwoVRXh0ZXJuYWxEb2N1bWVudGF0aW9uEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhIQCgN1cmwYAiABKAlSA3VybCKqAgoGU2NoZW1hElYKC2pzb25fc2NoZW1hGAEgASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIKanNvblNjaGVtYRIkCg1kaXNjcmltaW5hdG9yGAIgASgJUg1kaXNjcmltaW5hdG9yEhsKCXJlYWRfb25seRgDIAEoCFIIcmVhZE9ubHkSZQoNZXh0ZXJuYWxfZG9jcxgFIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEhgKB2V4YW1wbGUYBiABKAlSB2V4YW1wbGVKBAgEEAUi1woKCkpTT05TY2hlbWESEAoDcmVmGAMgASgJUgNyZWYSFAoFdGl0bGUYBSABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAYgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWZhdWx0GAcgASgJUgdkZWZhdWx0EhsKCXJlYWRfb25seRgIIAEoCFIIcmVhZE9ubHkSGAoHZXhhbXBsZRgJIAEoCVIHZXhhbXBsZRIfCgttdWx0aXBsZV9vZhgKIAEoAVIKbXVsdGlwbGVPZhIYCgdtYXhpbXVtGAsgASgBUgdtYXhpbXVtEisKEWV4Y2x1c2l2ZV9tYXhpbXVtGAwgASgIUhBleGNsdXNpdmVNYXhpbXVtEhgKB21pbmltdW0YDSABKAFSB21pbmltdW0SKwoRZXhjbHVzaXZlX21pbmltdW0YDiABKAhSEGV4Y2x1c2l2ZU1pbmltdW0SHQoKbWF4X2xlbmd0aBgPIAEoBFIJbWF4TGVuZ3RoEh0KCm1pbl9sZW5ndGgYECABKARSCW1pbkxlbmd0aBIYCgdwYXR0ZXJuGBEgASgJUgdwYXR0ZXJuEhsKCW1heF9pdGVtcxgUIAEoBFIIbWF4SXRlbXMSGwoJbWluX2l0ZW1zGBUgASgEUghtaW5JdGVtcxIhCgx1bmlxdWVfaXRlbXMYFiABKAhSC3VuaXF1ZUl0ZW1zEiUKDm1heF9wcm9wZXJ0aWVzGBggASgEUg1tYXhQcm9wZXJ0aWVzEiUKDm1pbl9wcm9wZXJ0aWVzGBkgASgEUg1taW5Qcm9wZXJ0aWVzEhoKCHJlcXVpcmVkGBogAygJUghyZXF1aXJlZBIUCgVhcnJheRgiIAMoCVIFYXJyYXkSXwoEdHlwZRgjIAMoDjJLLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuSlNPTlNjaGVtYVNpbXBsZVR5cGVzUgR0eXBlEhYKBmZvcm1hdBgkIAEoCVIGZm9ybWF0EhIKBGVudW0YLiADKAlSBGVudW0SegoTZmllbGRfY29uZmlndXJhdGlvbhjpByABKAsySC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkZpZWxkQ29uZmlndXJhdGlvblISZmllbGRDb25maWd1cmF0aW9uEmUKCmV4dGVuc2lvbnMYMCADKAsyRS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxo8ChJGaWVsZENvbmZpZ3VyYXRpb24SJgoPcGF0aF9wYXJhbV9uYW1lGC8gASgJUg1wYXRoUGFyYW1OYW1lGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIncKFUpTT05TY2hlbWFTaW1wbGVUeXBlcxILCgdVTktOT1dOEAASCQoFQVJSQVkQARILCgdCT09MRUFOEAISCwoHSU5URUdFUhADEggKBE5VTEwQBBIKCgZOVU1CRVIQBRIKCgZPQkpFQ1QQBhIKCgZTVFJJTkcQB0oECAEQAkoECAIQA0oECAQQBUoECBIQE0oECBMQFEoECBcQGEoECBsQHEoECBwQHUoECB0QHkoECB4QIkoECCUQKkoECCoQK0oECCsQLiLZAgoDVGFnEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYAyABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJeCgpleHRlbnNpb25zGAQgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASL3AQoTU2VjdXJpdHlEZWZpbml0aW9ucxJoCghzZWN1cml0eRgBIAMoCzJMLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnMuU2VjdXJpdHlFbnRyeVIIc2VjdXJpdHkadgoNU2VjdXJpdHlFbnRyeRIQCgNrZXkYASABKAlSA2tleRJPCgV2YWx1ZRgCIAEoCzI5LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lUgV2YWx1ZToCOAEi/wYKDlNlY3VyaXR5U2NoZW1lElIKBHR5cGUYASABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5UeXBlUgR0eXBlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhISCgRuYW1lGAMgASgJUgRuYW1lEkwKAmluGAQgASgOMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuSW5SAmluElIKBGZsb3cYBSABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5GbG93UgRmbG93EisKEWF1dGhvcml6YXRpb25fdXJsGAYgASgJUhBhdXRob3JpemF0aW9uVXJsEhsKCXRva2VuX3VybBgHIAEoCVIIdG9rZW5VcmwSSQoGc2NvcGVzGAggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzUgZzY29wZXMSaQoKZXh0ZW5zaW9ucxgJIAMoCzJJLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJLCgRUeXBlEhAKDFRZUEVfSU5WQUxJRBAAEg4KClRZUEVfQkFTSUMQARIQCgxUWVBFX0FQSV9LRVkQAhIPCgtUWVBFX09BVVRIMhADIjEKAkluEg4KCklOX0lOVkFMSUQQABIMCghJTl9RVUVSWRABEg0KCUlOX0hFQURFUhACImoKBEZsb3cSEAoMRkxPV19JTlZBTElEEAASEQoNRkxPV19JTVBMSUNJVBABEhEKDUZMT1dfUEFTU1dPUkQQAhIUChBGTE9XX0FQUExJQ0FUSU9OEAMSFAoQRkxPV19BQ0NFU1NfQ09ERRAEIvYCChNTZWN1cml0eVJlcXVpcmVtZW50EooBChRzZWN1cml0eV9yZXF1aXJlbWVudBgBIAMoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5UhNzZWN1cml0eVJlcXVpcmVtZW50GjAKGFNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZRIUCgVzY29wZRgBIAMoCVIFc2NvcGUanwEKGFNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRJtCgV2YWx1ZRgCIAEoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlUgV2YWx1ZToCOAEilgEKBlNjb3BlcxJSCgVzY29wZRgBIAMoCzI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blcy5TY29wZUVudHJ5UgVzY29wZRo4CgpTY29wZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEqOwoGU2NoZW1lEgsKB1VOS05PV04QABIICgRIVFRQEAESCQoFSFRUUFMQAhIGCgJXUxADEgcKA1dTUxAEQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr9BgoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvGixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bzp+ChFvcGVuYXBpdjJfc3dhZ2dlchIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiSCCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyUhBvcGVuYXBpdjJTd2FnZ2VyOoYBChNvcGVuYXBpdjJfb3BlcmF0aW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYkgggASgLMjQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uUhJvcGVuYXBpdjJPcGVyYXRpb246fgoQb3BlbmFwaXYyX3NjaGVtYRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiSCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSD29wZW5hcGl2MlNjaGVtYTp1Cg1vcGVuYXBpdjJfdGFnEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJIIIAEoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IMb3BlbmFwaXYyVGFnOn4KD29wZW5hcGl2Ml9maWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkgggASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIOb3BlbmFwaXYyRmllbGRCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCplPCiBwcm90by9ub3RpZmljYXRpb24vc2VydmljZS5wcm90bxIWYnVja2V0ZWVyLm5vdGlmaWNhdGlvbhoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvGiBwcm90by9ub3RpZmljYXRpb24vY29tbWFuZC5wcm90byItChtHZXRBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QSDgoCaWQYASABKAlSAmlkImgKHEdldEFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2USSAoMc3Vic2NyaXB0aW9uGAEgASgLMiQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbiK3BAodTGlzdEFkbWluU3Vic2NyaXB0aW9uc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJSCgxzb3VyY2VfdHlwZXMYAyADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxJYCghvcmRlcl9ieRgEIAEoDjI9LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdEFkbWluU3Vic2NyaXB0aW9uc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJtCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yRC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RBZG1pblN1YnNjcmlwdGlvbnNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBI2CghkaXNhYmxlZBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkIkAKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQASKlAQoeTGlzdEFkbWluU3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkoKDXN1YnNjcmlwdGlvbnMYASADKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblINc3Vic2NyaXB0aW9ucxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKvAQokTGlzdEVuYWJsZWRBZG1pblN1YnNjcmlwdGlvbnNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISUgoMc291cmNlX3R5cGVzGAMgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiiwEKJUxpc3RFbmFibGVkQWRtaW5TdWJzY3JpcHRpb25zUmVzcG9uc2USSgoNc3Vic2NyaXB0aW9ucxgBIAMoCzIkLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uUg1zdWJzY3JpcHRpb25zEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yInIKHkNyZWF0ZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBJQCgdjb21tYW5kGAEgASgLMjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5DcmVhdGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmRSB2NvbW1hbmQiIQofQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSKCAQoeRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJQCgdjb21tYW5kGAIgASgLMjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmRSB2NvbW1hbmQiIQofRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSKCAQoeRW5hYmxlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJQCgdjb21tYW5kGAIgASgLMjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5FbmFibGVBZG1pblN1YnNjcmlwdGlvbkNvbW1hbmRSB2NvbW1hbmQiIQofRW5hYmxlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSKEAQofRGlzYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSUQoHY29tbWFuZBgCIAEoCzI3LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGlzYWJsZUFkbWluU3Vic2NyaXB0aW9uQ29tbWFuZFIHY29tbWFuZCIiCiBEaXNhYmxlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSKkAwoeVXBkYXRlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJ3ChhhZGRfc291cmNlX3R5cGVzX2NvbW1hbmQYAiABKAsyPi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkFkZEFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNDb21tYW5kUhVhZGRTb3VyY2VUeXBlc0NvbW1hbmQSgAEKG2RlbGV0ZV9zb3VyY2VfdHlwZXNfY29tbWFuZBgDIAEoCzJBLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlQWRtaW5TdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0NvbW1hbmRSGGRlbGV0ZVNvdXJjZVR5cGVzQ29tbWFuZBJ2ChtyZW5hbWVfc3Vic2NyaXB0aW9uX2NvbW1hbmQYBCABKAsyNi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlbmFtZUFkbWluU3Vic2NyaXB0aW9uQ29tbWFuZFIZcmVuYW1lU3Vic2NyaXB0aW9uQ29tbWFuZCIhCh9VcGRhdGVBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIl8KFkdldFN1YnNjcmlwdGlvblJlcXVlc3QSEwoCaWQYAiABKAlCA+BBAlICaWQSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZEoECAEQAiJjChdHZXRTdWJzY3JpcHRpb25SZXNwb25zZRJICgxzdWJzY3JpcHRpb24YASABKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uIp8FChhMaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchJSCgxzb3VyY2VfdHlwZXMYBCADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxJTCghvcmRlcl9ieRgFIAEoDjI4LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSaAoPb3JkZXJfZGlyZWN0aW9uGAYgASgOMj8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAcgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSJQoOZW52aXJvbm1lbnRfaWQYCSABKAlSDWVudmlyb25tZW50SWQSLAoPb3JnYW5pemF0aW9uX2lkGAogASgJQgPgQQJSDm9yZ2FuaXphdGlvbklkIlwKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0VOVklST05NRU5UEAQSCQoFU1RBVEUQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIioAEKGUxpc3RTdWJzY3JpcHRpb25zUmVzcG9uc2USSgoNc3Vic2NyaXB0aW9ucxgBIAMoCzIkLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uUg1zdWJzY3JpcHRpb25zEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50ItcBCh9MaXN0RW5hYmxlZFN1YnNjcmlwdGlvbnNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISUgoMc291cmNlX3R5cGVzGAQgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgBEAIihgEKIExpc3RFbmFibGVkU3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkoKDXN1YnNjcmlwdGlvbnMYASADKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblINc3Vic2NyaXB0aW9ucxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvciLWAgoZQ3JlYXRlU3Vic2NyaXB0aW9uUmVxdWVzdBJPCgdjb21tYW5kGAIgASgLMjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5DcmVhdGVTdWJzY3JpcHRpb25Db21tYW5kQgIYAVIHY29tbWFuZBIqCg5lbnZpcm9ubWVudF9pZBgDIAEoCUID4EECUg1lbnZpcm9ubWVudElkEhcKBG5hbWUYBCABKAlCA+BBAlIEbmFtZRJXCgxzb3VyY2VfdHlwZXMYBSADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlQgPgQQJSC3NvdXJjZVR5cGVzEkQKCXJlY2lwaWVudBgGIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50QgPgQQJSCXJlY2lwaWVudEoECAEQAiJmChpDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZRJICgxzdWJzY3JpcHRpb24YASABKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uIqkBChlEZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBJPCgdjb21tYW5kGAMgASgLMjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVTdWJzY3JpcHRpb25Db21tYW5kQgIYAVIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIcChpEZWxldGVTdWJzY3JpcHRpb25SZXNwb25zZSKlAQoZRW5hYmxlU3Vic2NyaXB0aW9uUmVxdWVzdBIOCgJpZBgCIAEoCVICaWQSSwoHY29tbWFuZBgDIAEoCzIxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRW5hYmxlU3Vic2NyaXB0aW9uQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIcChpFbmFibGVTdWJzY3JpcHRpb25SZXNwb25zZSKnAQoaRGlzYWJsZVN1YnNjcmlwdGlvblJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEkwKB2NvbW1hbmQYAyABKAsyMi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVTdWJzY3JpcHRpb25Db21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIARACIh0KG0Rpc2FibGVTdWJzY3JpcHRpb25SZXNwb25zZSK8BgoZVXBkYXRlU3Vic2NyaXB0aW9uUmVxdWVzdBITCgJpZBgCIAEoCUID4EECUgJpZBKUAQoYYWRkX3NvdXJjZV90eXBlc19jb21tYW5kGAMgASgLMi0uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5BZGRTb3VyY2VUeXBlc0NvbW1hbmRCLBgBkkEnMiVkZXByZWNhdGVkLiB1c2Ugc291cmNlX3R5cGVzIGluc3RlYWQuUhVhZGRTb3VyY2VUeXBlc0NvbW1hbmQSnQEKG2RlbGV0ZV9zb3VyY2VfdHlwZXNfY29tbWFuZBgEIAEoCzIwLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGVsZXRlU291cmNlVHlwZXNDb21tYW5kQiwYAZJBJzIlZGVwcmVjYXRlZC4gdXNlIHNvdXJjZV90eXBlcyBpbnN0ZWFkLlIYZGVsZXRlU291cmNlVHlwZXNDb21tYW5kEpcBChtyZW5hbWVfc3Vic2NyaXB0aW9uX2NvbW1hbmQYBSABKAsyMS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlbmFtZVN1YnNjcmlwdGlvbkNvbW1hbmRCJBgBkkEfMh1kZXByZWNhdGVkLiB1c2UgbmFtZSBpbnN0ZWFkLlIZcmVuYW1lU3Vic2NyaXB0aW9uQ29tbWFuZBIqCg5lbnZpcm9ubWVudF9pZBgGIAEoCUID4EECUg1lbnZpcm9ubWVudElkElIKDHNvdXJjZV90eXBlcxgHIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEjAKBG5hbWUYCCABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSBG5hbWUSgAEKCGRpc2FibGVkGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUJIkkFFKghkaXNhYmxlZDI5aWYgdHJ1ZSwgdGhlIHN1YnNjcmlwdGlvbiBpcyBkaXNhYmxlZCwgb3RoZXJ3aXNlIGVuYWJsZWQuUghkaXNhYmxlZEoECAEQAiJmChpVcGRhdGVTdWJzY3JpcHRpb25SZXNwb25zZRJICgxzdWJzY3JpcHRpb24YASABKAsyJC5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uMtofChNOb3RpZmljYXRpb25TZXJ2aWNlEoMBChRHZXRBZG1pblN1YnNjcmlwdGlvbhIzLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uR2V0QWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0GjQuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5HZXRBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIgASiQEKFkxpc3RBZG1pblN1YnNjcmlwdGlvbnMSNS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RBZG1pblN1YnNjcmlwdGlvbnNSZXF1ZXN0GjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0QWRtaW5TdWJzY3JpcHRpb25zUmVzcG9uc2UiABKeAQodTGlzdEVuYWJsZWRBZG1pblN1YnNjcmlwdGlvbnMSPC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkxpc3RFbmFibGVkQWRtaW5TdWJzY3JpcHRpb25zUmVxdWVzdBo9LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdEVuYWJsZWRBZG1pblN1YnNjcmlwdGlvbnNSZXNwb25zZSIAEowBChdDcmVhdGVBZG1pblN1YnNjcmlwdGlvbhI2LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uQ3JlYXRlQWRtaW5TdWJzY3JpcHRpb25SZXF1ZXN0GjcuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5DcmVhdGVBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIgASjAEKF0RlbGV0ZUFkbWluU3Vic2NyaXB0aW9uEjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QaNy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRlbGV0ZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UiABKMAQoXRW5hYmxlQWRtaW5TdWJzY3JpcHRpb24SNi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkVuYWJsZUFkbWluU3Vic2NyaXB0aW9uUmVxdWVzdBo3LmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRW5hYmxlQWRtaW5TdWJzY3JpcHRpb25SZXNwb25zZSIAEo8BChhEaXNhYmxlQWRtaW5TdWJzY3JpcHRpb24SNy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QaOC5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVBZG1pblN1YnNjcmlwdGlvblJlc3BvbnNlIgASjAEKF1VwZGF0ZUFkbWluU3Vic2NyaXB0aW9uEjYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5VcGRhdGVBZG1pblN1YnNjcmlwdGlvblJlcXVlc3QaNy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlVwZGF0ZUFkbWluU3Vic2NyaXB0aW9uUmVzcG9uc2UiABK8BAoPR2V0U3Vic2NyaXB0aW9uEi4uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5HZXRTdWJzY3JpcHRpb25SZXF1ZXN0Gi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5HZXRTdWJzY3JpcHRpb25SZXNwb25zZSLHA5JBqwMKDHN1YnNjcmlwdGlvbhIDR2V0GhFHZXQgc3Vic2NyaXB0aW9uLioXd2ViLnYxLnN1YnNjcmlwdGlvbi5nZXRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwISEhAvdjEvc3Vic2NyaXB0aW9uEscEChFMaXN0U3Vic2NyaXB0aW9ucxIwLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0GjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlIswDkkGvAwoMc3Vic2NyaXB0aW9uEgRMaXN0GhNMaXN0IHN1YnNjcmlwdGlvbnMuKhh3ZWIudjEuc3Vic2NyaXB0aW9uLmxpc3RKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwITEhEvdjEvc3Vic2NyaXB0aW9ucxKPAQoYTGlzdEVuYWJsZWRTdWJzY3JpcHRpb25zEjcuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0RW5hYmxlZFN1YnNjcmlwdGlvbnNSZXF1ZXN0GjguYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5MaXN0RW5hYmxlZFN1YnNjcmlwdGlvbnNSZXNwb25zZSIAEtEEChJDcmVhdGVTdWJzY3JpcHRpb24SMS5idWNrZXRlZXIubm90aWZpY2F0aW9uLkNyZWF0ZVN1YnNjcmlwdGlvblJlcXVlc3QaMi5idWNrZXRlZXIubm90aWZpY2F0aW9uLkNyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlItMDkkG0AwoMc3Vic2NyaXB0aW9uEgZDcmVhdGUaFENyZWF0ZSBzdWJzY3JpcHRpb24uKhp3ZWIudjEuc3Vic2NyaXB0aW9uLmNyZWF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhUiEC92MS9zdWJzY3JpcHRpb246ASoSfQoSRGVsZXRlU3Vic2NyaXB0aW9uEjEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0GjIuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5EZWxldGVTdWJzY3JpcHRpb25SZXNwb25zZSIAEn0KEkVuYWJsZVN1YnNjcmlwdGlvbhIxLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRW5hYmxlU3Vic2NyaXB0aW9uUmVxdWVzdBoyLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRW5hYmxlU3Vic2NyaXB0aW9uUmVzcG9uc2UiABKAAQoTRGlzYWJsZVN1YnNjcmlwdGlvbhIyLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uRGlzYWJsZVN1YnNjcmlwdGlvblJlcXVlc3QaMy5idWNrZXRlZXIubm90aWZpY2F0aW9uLkRpc2FibGVTdWJzY3JpcHRpb25SZXNwb25zZSIAEtEEChJVcGRhdGVTdWJzY3JpcHRpb24SMS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlVwZGF0ZVN1YnNjcmlwdGlvblJlcXVlc3QaMi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlVwZGF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlItMDkkG0AwoMc3Vic2NyaXB0aW9uEgZVcGRhdGUaFFVwZGF0ZSBzdWJzY3JpcHRpb24uKhp3ZWIudjEuc3Vic2NyaXB0aW9uLnVwZGF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhUyEC92MS9zdWJzY3JpcHRpb246ASpCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8z
pushDescriptor: CuoCChhwcm90by9wdXNoL2NvbW1hbmQucHJvdG8SDmJ1Y2tldGVlci5wdXNoInEKEUNyZWF0ZVB1c2hDb21tYW5kEhIKBHRhZ3MYAiADKAlSBHRhZ3MSEgoEbmFtZRgDIAEoCVIEbmFtZRIuChNmY21fc2VydmljZV9hY2NvdW50GAQgASgMUhFmY21TZXJ2aWNlQWNjb3VudEoECAEQAiIoChJBZGRQdXNoVGFnc0NvbW1hbmQSEgoEdGFncxgBIAMoCVIEdGFncyIrChVEZWxldGVQdXNoVGFnc0NvbW1hbmQSEgoEdGFncxgBIAMoCVIEdGFncyITChFEZWxldGVQdXNoQ29tbWFuZCInChFSZW5hbWVQdXNoQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lQi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9wdXNoYgZwcm90bzMKnAMKFXByb3RvL3B1c2gvcHVzaC5wcm90bxIOYnVja2V0ZWVyLnB1c2giugIKBFB1c2gSDgoCaWQYASABKAlSAmlkEhIKBHRhZ3MYAyADKAlSBHRhZ3MSGAoHZGVsZXRlZBgEIAEoCFIHZGVsZXRlZBISCgRuYW1lGAUgASgJUgRuYW1lEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSLgoTZmNtX3NlcnZpY2VfYWNjb3VudBgIIAEoCVIRZmNtU2VydmljZUFjY291bnQSGgoIZGlzYWJsZWQYCSABKAhSCGRpc2FibGVkEiUKDmVudmlyb25tZW50X2lkGAogASgJUg1lbnZpcm9ubWVudElkEikKEGVudmlyb25tZW50X25hbWUYCyABKAlSD2Vudmlyb25tZW50TmFtZUoECAIQA0IuWixnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vcHVzaGIGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKhwUKFWdvb2dsZS9hcGkvaHR0cC5wcm90bxIKZ29vZ2xlLmFwaSJ5CgRIdHRwEioKBXJ1bGVzGAEgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIFcnVsZXMSRQofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCFIcZnVsbHlEZWNvZGVSZXNlcnZlZEV4cGFuc2lvbiK1AgoISHR0cFJ1bGUSGgoIc2VsZWN0b3IYASABKAlSCHNlbGVjdG9yEhIKA2dldBgCIAEoCUgAUgNnZXQSEgoDcHV0GAMgASgJSABSA3B1dBIUCgRwb3N0GAQgASgJSABSBHBvc3QSGAoGZGVsZXRlGAUgASgJSABSBmRlbGV0ZRIWCgVwYXRjaBgGIAEoCUgAUgVwYXRjaBI3CgZjdXN0b20YCCABKAsyHS5nb29nbGUuYXBpLkN1c3RvbUh0dHBQYXR0ZXJuSABSBmN1c3RvbRISCgRib2R5GAcgASgJUgRib2R5EkUKE2FkZGl0aW9uYWxfYmluZGluZ3MYCyADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUhJhZGRpdGlvbmFsQmluZGluZ3NCCQoHcGF0dGVybiI7ChFDdXN0b21IdHRwUGF0dGVybhISCgRraW5kGAEgASgJUgRraW5kEhIKBHBhdGgYAiABKAlSBHBhdGhCagoOY29tLmdvb2dsZS5hcGlCCUh0dHBQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc/gBAaICBEdBUEliBnByb3RvMwrhRgogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJNChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUi/gQKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSGAoHZWRpdGlvbhgNIAEoCVIHZWRpdGlvbiK5BgoPRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSOwoFZmllbGQYAiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SBWZpZWxkEkMKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEkEKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1IKbmVzdGVkVHlwZRJBCgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSWAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVIOZXh0ZW5zaW9uUmFuZ2USRAoKb25lb2ZfZGVjbBgIIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1IJb25lb2ZEZWNsEjkKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNSB29wdGlvbnMSVQoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgKIAMoCVIMcmVzZXJ2ZWROYW1lGnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKtBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhJoCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEUgx2ZXJpZmljYXRpb24aswEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIjCgtpc19yZXBlYXRlZBgEIAEoCEICGAFSCmlzUmVwZWF0ZWQSGgoIcmVzZXJ2ZWQYBSABKAhSCHJlc2VydmVkEhoKCHJlcGVhdGVkGAYgASgIUghyZXBlYXRlZCI0ChFWZXJpZmljYXRpb25TdGF0ZRIPCgtERUNMQVJBVElPThAAEg4KClVOVkVSSUZJRUQQASoJCOgHEICAgIACIsEGChRGaWVsZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgDIAEoBVIGbnVtYmVyEkEKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsUgVsYWJlbBI+CgR0eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSBHR5cGUSGwoJdHlwZV9uYW1lGAYgASgJUgh0eXBlTmFtZRIaCghleHRlbmRlZRgCIAEoCVIIZXh0ZW5kZWUSIwoNZGVmYXVsdF92YWx1ZRgHIAEoCVIMZGVmYXVsdFZhbHVlEh8KC29uZW9mX2luZGV4GAkgASgFUgpvbmVvZkluZGV4EhsKCWpzb25fbmFtZRgKIAEoCVIIanNvbk5hbWUSNwoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNSB29wdGlvbnMSJwoPcHJvdG8zX29wdGlvbmFsGBEgASgIUg5wcm90bzNPcHRpb25hbCK2AgoEVHlwZRIPCgtUWVBFX0RPVUJMRRABEg4KClRZUEVfRkxPQVQQAhIOCgpUWVBFX0lOVDY0EAMSDwoLVFlQRV9VSU5UNjQQBBIOCgpUWVBFX0lOVDMyEAUSEAoMVFlQRV9GSVhFRDY0EAYSEAoMVFlQRV9GSVhFRDMyEAcSDQoJVFlQRV9CT09MEAgSDwoLVFlQRV9TVFJJTkcQCRIOCgpUWVBFX0dST1VQEAoSEAoMVFlQRV9NRVNTQUdFEAsSDgoKVFlQRV9CWVRFUxAMEg8KC1RZUEVfVUlOVDMyEA0SDQoJVFlQRV9FTlVNEA4SEQoNVFlQRV9TRklYRUQzMhAPEhEKDVRZUEVfU0ZJWEVENjQQEBIPCgtUWVBFX1NJTlQzMhAREg8KC1RZUEVfU0lOVDY0EBIiQwoFTGFiZWwSEgoOTEFCRUxfT1BUSU9OQUwQARISCg5MQUJFTF9SRVFVSVJFRBACEhIKDkxBQkVMX1JFUEVBVEVEEAMiYwoUT25lb2ZEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI3CgdvcHRpb25zGAIgASgLMh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1IHb3B0aW9ucyLjAgoTRW51bURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj8KBXZhbHVlGAIgAygLMikuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1IFdmFsdWUSNgoHb3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1IHb3B0aW9ucxJdCg5yZXNlcnZlZF9yYW5nZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYBSADKAlSDHJlc2VydmVkTmFtZRo7ChFFbnVtUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQigwEKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgCIAEoBVIGbnVtYmVyEjsKB29wdGlvbnMYAyABKAsyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1IHb3B0aW9ucyKnAQoWU2VydmljZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj4KBm1ldGhvZBgCIAMoCzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9SBm1ldGhvZBI5CgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zUgdvcHRpb25zIokCChVNZXRob2REZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIdCgppbnB1dF90eXBlGAIgASgJUglpbnB1dFR5cGUSHwoLb3V0cHV0X3R5cGUYAyABKAlSCm91dHB1dFR5cGUSOAoHb3B0aW9ucxgEIAEoCzIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zUgdvcHRpb25zEjAKEGNsaWVudF9zdHJlYW1pbmcYBSABKAg6BWZhbHNlUg9jbGllbnRTdHJlYW1pbmcSMAoQc2VydmVyX3N0cmVhbWluZxgGIAEoCDoFZmFsc2VSD3NlcnZlclN0cmVhbWluZyKRCQoLRmlsZU9wdGlvbnMSIQoMamF2YV9wYWNrYWdlGAEgASgJUgtqYXZhUGFja2FnZRIwChRqYXZhX291dGVyX2NsYXNzbmFtZRgIIAEoCVISamF2YU91dGVyQ2xhc3NuYW1lEjUKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlUhFqYXZhTXVsdGlwbGVGaWxlcxJECh1qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaBgUIAEoCEICGAFSGWphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gSOgoWamF2YV9zdHJpbmdfY2hlY2tfdXRmOBgbIAEoCDoFZmFsc2VSE2phdmFTdHJpbmdDaGVja1V0ZjgSUwoMb3B0aW1pemVfZm9yGAkgASgOMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZToFU1BFRURSC29wdGltaXplRm9yEh0KCmdvX3BhY2thZ2UYCyABKAlSCWdvUGFja2FnZRI1ChNjY19nZW5lcmljX3NlcnZpY2VzGBAgASgIOgVmYWxzZVIRY2NHZW5lcmljU2VydmljZXMSOQoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZVITamF2YUdlbmVyaWNTZXJ2aWNlcxI1ChNweV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZVIRcHlHZW5lcmljU2VydmljZXMSNwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZhbHNlUhJwaHBHZW5lcmljU2VydmljZXMSJQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSLgoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoEdHJ1ZVIOY2NFbmFibGVBcmVuYXMSKgoRb2JqY19jbGFzc19wcmVmaXgYJCABKAlSD29iamNDbGFzc1ByZWZpeBIpChBjc2hhcnBfbmFtZXNwYWNlGCUgASgJUg9jc2hhcnBOYW1lc3BhY2USIQoMc3dpZnRfcHJlZml4GCcgASgJUgtzd2lmdFByZWZpeBIoChBwaHBfY2xhc3NfcHJlZml4GCggASgJUg5waHBDbGFzc1ByZWZpeBIjCg1waHBfbmFtZXNwYWNlGCkgASgJUgxwaHBOYW1lc3BhY2USNAoWcGhwX21ldGFkYXRhX25hbWVzcGFjZRgsIAEoCVIUcGhwTWV0YWRhdGFOYW1lc3BhY2USIQoMcnVieV9wYWNrYWdlGC0gASgJUgtydWJ5UGFja2FnZRJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiI6CgxPcHRpbWl6ZU1vZGUSCQoFU1BFRUQQARINCglDT0RFX1NJWkUQAhIQCgxMSVRFX1JVTlRJTUUQAyoJCOgHEICAgIACSgQIJhAnIrsDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoihQkKDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSgoGdGFyZ2V0GBIgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlQgIYAVIGdGFyZ2V0EkgKB3RhcmdldHMYEyADKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVSB3RhcmdldHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iLwoFQ1R5cGUSCgoGU1RSSU5HEAASCAoEQ09SRBABEhAKDFNUUklOR19QSUVDRRACIjUKBkpTVHlwZRINCglKU19OT1JNQUwQABINCglKU19TVFJJTkcQARINCglKU19OVU1CRVIQAiJVCg9PcHRpb25SZXRlbnRpb24SFQoRUkVURU5USU9OX1VOS05PV04QABIVChFSRVRFTlRJT05fUlVOVElNRRABEhQKEFJFVEVOVElPTl9TT1VSQ0UQAiKMAgoQT3B0aW9uVGFyZ2V0VHlwZRIXChNUQVJHRVRfVFlQRV9VTktOT1dOEAASFAoQVEFSR0VUX1RZUEVfRklMRRABEh8KG1RBUkdFVF9UWVBFX0VYVEVOU0lPTl9SQU5HRRACEhcKE1RBUkdFVF9UWVBFX01FU1NBR0UQAxIVChFUQVJHRVRfVFlQRV9GSUVMRBAEEhUKEVRBUkdFVF9UWVBFX09ORU9GEAUSFAoQVEFSR0VUX1RZUEVfRU5VTRAGEhoKFlRBUkdFVF9UWVBFX0VOVU1fRU5UUlkQBxIXChNUQVJHRVRfVFlQRV9TRVJWSUNFEAgSFgoSVEFSR0VUX1RZUEVfTUVUSE9EEAkqCQjoBxCAgICAAkoECAQQBSJzCgxPbmVvZk9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKYAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYingEKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKcAQoOU2VydmljZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLgAgoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnAgoOU291cmNlQ29kZUluZm8SRAoIbG9jYXRpb24YASADKAsyKC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25SCGxvY2F0aW9uGs4BCghMb2NhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIWCgRzcGFuGAIgAygFQgIQAVIEc3BhbhIpChBsZWFkaW5nX2NvbW1lbnRzGAMgASgJUg9sZWFkaW5nQ29tbWVudHMSKwoRdHJhaWxpbmdfY29tbWVudHMYBCABKAlSEHRyYWlsaW5nQ29tbWVudHMSOgoZbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cxgGIAMoCVIXbGVhZGluZ0RldGFjaGVkQ29tbWVudHMi0AIKEUdlbmVyYXRlZENvZGVJbmZvEk0KCmFubm90YXRpb24YASADKAsyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvblIKYW5ub3RhdGlvbhrrAQoKQW5ub3RhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIfCgtzb3VyY2VfZmlsZRgCIAEoCVIKc291cmNlRmlsZRIUCgViZWdpbhgDIAEoBVIFYmVnaW4SEAoDZW5kGAQgASgFUgNlbmQSUgoIc2VtYW50aWMYBSABKA4yNi5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5TZW1hbnRpY1IIc2VtYW50aWMiKAoIU2VtYW50aWMSCAoETk9ORRAAEgcKA1NFVBABEgkKBUFMSUFTEAJCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIQRGVzY3JpcHRvclByb3Rvc0gBWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGL4AQGiAgNHUEKqAhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgqoAgocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxIKZ29vZ2xlLmFwaRoVZ29vZ2xlL2FwaS9odHRwLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzpLCgRodHRwEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYsMq8IiABKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgRodHRwQm4KDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwrJIQoYcHJvdG8vcHVzaC9zZXJ2aWNlLnByb3RvEg5idWNrZXRlZXIucHVzaBoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhVwcm90by9wdXNoL3B1c2gucHJvdG8aGHByb3RvL3B1c2gvY29tbWFuZC5wcm90byLZAQoRQ3JlYXRlUHVzaFJlcXVlc3QSPwoHY29tbWFuZBgCIAEoCzIhLmJ1Y2tldGVlci5wdXNoLkNyZWF0ZVB1c2hDb21tYW5kQgIYAVIHY29tbWFuZBISCgR0YWdzGAMgAygJUgR0YWdzEhIKBG5hbWUYBCABKAlSBG5hbWUSLgoTZmNtX3NlcnZpY2VfYWNjb3VudBgFIAEoDFIRZmNtU2VydmljZUFjY291bnQSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiPgoSQ3JlYXRlUHVzaFJlc3BvbnNlEigKBHB1c2gYASABKAsyFC5idWNrZXRlZXIucHVzaC5QdXNoUgRwdXNoIqEEChFMaXN0UHVzaGVzUmVxdWVzdBIbCglwYWdlX3NpemUYAiABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgDIAEoCVIGY3Vyc29yEkQKCG9yZGVyX2J5GAQgASgOMikuYnVja2V0ZWVyLnB1c2guTGlzdFB1c2hlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJZCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yMC5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQSJwoPb3JnYW5pemF0aW9uX2lkGAggASgJUg5vcmdhbml6YXRpb25JZBI2CghkaXNhYmxlZBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkIlwKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0VOVklST05NRU5UEAQSCQoFU1RBVEUQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIiewoSTGlzdFB1c2hlc1Jlc3BvbnNlEiwKBnB1c2hlcxgBIAMoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBnB1c2hlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKNAQoRRGVsZXRlUHVzaFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEjsKB2NvbW1hbmQYAyABKAsyIS5idWNrZXRlZXIucHVzaC5EZWxldGVQdXNoQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIUChJEZWxldGVQdXNoUmVzcG9uc2Ui7gMKEVVwZGF0ZVB1c2hSZXF1ZXN0EhMKAmlkGAIgASgJQgPgQQJSAmlkElkKFWFkZF9wdXNoX3RhZ3NfY29tbWFuZBgDIAEoCzIiLmJ1Y2tldGVlci5wdXNoLkFkZFB1c2hUYWdzQ29tbWFuZEICGAFSEmFkZFB1c2hUYWdzQ29tbWFuZBJiChhkZWxldGVfcHVzaF90YWdzX2NvbW1hbmQYBCABKAsyJS5idWNrZXRlZXIucHVzaC5EZWxldGVQdXNoVGFnc0NvbW1hbmRCAhgBUhVkZWxldGVQdXNoVGFnc0NvbW1hbmQSVQoTcmVuYW1lX3B1c2hfY29tbWFuZBgFIAEoCzIhLmJ1Y2tldGVlci5wdXNoLlJlbmFtZVB1c2hDb21tYW5kQgIYAVIRcmVuYW1lUHVzaENvbW1hbmQSEgoEdGFncxgGIAMoCVIEdGFncxIwCgRuYW1lGAcgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEioKDmVudmlyb25tZW50X2lkGAggASgJQgPgQQJSDWVudmlyb25tZW50SWQSNgoIZGlzYWJsZWQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZEoECAEQAiI+ChJVcGRhdGVQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2giUQoOR2V0UHVzaFJlcXVlc3QSKgoOZW52aXJvbm1lbnRfaWQYASABKAlCA+BBAlINZW52aXJvbm1lbnRJZBITCgJpZBgCIAEoCUID4EECUgJpZCI7Cg9HZXRQdXNoUmVzcG9uc2USKAoEcHVzaBgBIAEoCzIULmJ1Y2tldGVlci5wdXNoLlB1c2hSBHB1c2gygBEKC1B1c2hTZXJ2aWNlEoQECgpMaXN0UHVzaGVzEiEuYnVja2V0ZWVyLnB1c2guTGlzdFB1c2hlc1JlcXVlc3QaIi5idWNrZXRlZXIucHVzaC5MaXN0UHVzaGVzUmVzcG9uc2UirgOSQZgDCgRwdXNoEgRMaXN0GgxMaXN0IHB1c2hlcy4qEHdlYi52MS5wdXNoLmxpc3RKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIMEgovdjEvcHVzaGVzEosECgpDcmVhdGVQdXNoEiEuYnVja2V0ZWVyLnB1c2guQ3JlYXRlUHVzaFJlcXVlc3QaIi5idWNrZXRlZXIucHVzaC5DcmVhdGVQdXNoUmVzcG9uc2UitQOSQZ4DCgRwdXNoEgZDcmVhdGUaDkNyZWF0ZSBhIHB1c2guKhJ3ZWIudjEucHVzaC5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwINIggvdjEvcHVzaDoBKhKLBAoKVXBkYXRlUHVzaBIhLmJ1Y2tldGVlci5wdXNoLlVwZGF0ZVB1c2hSZXF1ZXN0GiIuYnVja2V0ZWVyLnB1c2guVXBkYXRlUHVzaFJlc3BvbnNlIrUDkkGeAwoEcHVzaBIGVXBkYXRlGg5VcGRhdGUgYSBwdXNoLioSd2ViLnYxLnB1c2gudXBkYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDTIIL3YxL3B1c2g6ASoS9gMKB0dldFB1c2gSHi5idWNrZXRlZXIucHVzaC5HZXRQdXNoUmVxdWVzdBofLmJ1Y2tldGVlci5wdXNoLkdldFB1c2hSZXNwb25zZSKpA5JBlQMKBHB1c2gSA0dldBoLR2V0IGEgcHVzaC4qD3dlYi52MS5wdXNoLmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgoSCC92MS9wdXNoElUKCkRlbGV0ZVB1c2gSIS5idWNrZXRlZXIucHVzaC5EZWxldGVQdXNoUmVxdWVzdBoiLmJ1Y2tldGVlci5wdXNoLkRlbGV0ZVB1c2hSZXNwb25zZSIAQi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9wdXNoYgZwcm90bzM=
- batchDescriptor: CuMFChlwcm90by9iYXRjaC9zZXJ2aWNlLnByb3RvEg9idWNrZXRlZXIuYmF0Y2giPgoPQmF0Y2hKb2JSZXF1ZXN0EisKA2pvYhgBIAEoDjIZLmJ1Y2tldGVlci5iYXRjaC5CYXRjaEpvYlIDam9iIhIKEEJhdGNoSm9iUmVzcG9uc2UqvQMKCEJhdGNoSm9iEhsKF0V4cGVyaW1lbnRTdGF0dXNVcGRhdGVyEAASHAoYRXhwZXJpbWVudFJ1bm5pbmdXYXRjaGVyEAESFwoTRmVhdHVyZVN0YWxlV2F0Y2hlchACEhMKD01hdUNvdW50V2F0Y2hlchADEhMKD0RhdGV0aW1lV2F0Y2hlchAEEhUKEUV2ZW50Q291bnRXYXRjaGVyEAUSFwoTRG9tYWluRXZlbnRJbmZvcm1lchAGEhcKE1JlZGlzQ291bnRlckRlbGV0ZXIQBxIdChlQcm9ncmVzc2l2ZVJvbGxvdXRXYXRjaGVyEAgSGAoURXhwZXJpbWVudENhbGN1bGF0b3IQCRIRCg1NYXVTdW1tYXJpemVyEAoSFwoTTWF1UGFydGl0aW9uRGVsZXRlchALEhcKE01hdVBhcnRpdGlvbkNyZWF0b3IQDBIVChFGZWF0dXJlRmxhZ0NhY2hlchANEhUKEVNlZ21lbnRVc2VyQ2FjaGVyEA4SEAoMQXBpS2V5Q2FjaGVyEA8SFgoSQXV0b09wc1J1bGVzQ2FjaGVyEBASFAoQRXhwZXJpbWVudENhY2hlchARMmgKDEJhdGNoU2VydmljZRJYCg9FeGVjdXRlQmF0Y2hKb2ISIC5idWNrZXRlZXIuYmF0Y2guQmF0Y2hKb2JSZXF1ZXN0GiEuYnVja2V0ZWVyLmJhdGNoLkJhdGNoSm9iUmVzcG9uc2UiAEIvWi1naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYmF0Y2hiBnByb3RvMw==
+ batchDescriptor: CvMFChlwcm90by9iYXRjaC9zZXJ2aWNlLnByb3RvEg9idWNrZXRlZXIuYmF0Y2giPgoPQmF0Y2hKb2JSZXF1ZXN0EisKA2pvYhgBIAEoDjIZLmJ1Y2tldGVlci5iYXRjaC5CYXRjaEpvYlIDam9iIhIKEEJhdGNoSm9iUmVzcG9uc2UqzQMKCEJhdGNoSm9iEhsKF0V4cGVyaW1lbnRTdGF0dXNVcGRhdGVyEAASHAoYRXhwZXJpbWVudFJ1bm5pbmdXYXRjaGVyEAESFwoTRmVhdHVyZVN0YWxlV2F0Y2hlchACEhMKD01hdUNvdW50V2F0Y2hlchADEhMKD0RhdGV0aW1lV2F0Y2hlchAEEhUKEUV2ZW50Q291bnRXYXRjaGVyEAUSFwoTRG9tYWluRXZlbnRJbmZvcm1lchAGEhcKE1JlZGlzQ291bnRlckRlbGV0ZXIQBxIdChlQcm9ncmVzc2l2ZVJvbGxvdXRXYXRjaGVyEAgSGAoURXhwZXJpbWVudENhbGN1bGF0b3IQCRIRCg1NYXVTdW1tYXJpemVyEAoSFwoTTWF1UGFydGl0aW9uRGVsZXRlchALEhcKE01hdVBhcnRpdGlvbkNyZWF0b3IQDBIVChFGZWF0dXJlRmxhZ0NhY2hlchANEhUKEVNlZ21lbnRVc2VyQ2FjaGVyEA4SEAoMQXBpS2V5Q2FjaGVyEA8SFgoSQXV0b09wc1J1bGVzQ2FjaGVyEBASFAoQRXhwZXJpbWVudENhY2hlchAREg4KClRhZ0RlbGV0ZXIQEjJoCgxCYXRjaFNlcnZpY2USWAoPRXhlY3V0ZUJhdGNoSm9iEiAuYnVja2V0ZWVyLmJhdGNoLkJhdGNoSm9iUmVxdWVzdBohLmJ1Y2tldGVlci5iYXRjaC5CYXRjaEpvYlJlc3BvbnNlIgBCL1otZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2JhdGNoYgZwcm90bzM=
environmentDescriptor: CtUMCh9wcm90by9lbnZpcm9ubWVudC9jb21tYW5kLnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQitQEKGkNyZWF0ZUVudmlyb25tZW50VjJDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAiABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEh0KCnByb2plY3RfaWQYBCABKAlSCXByb2plY3RJZBInCg9yZXF1aXJlX2NvbW1lbnQYBSABKAhSDnJlcXVpcmVDb21tZW50IjAKGlJlbmFtZUVudmlyb25tZW50VjJDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiSQolQ2hhbmdlRGVzY3JpcHRpb25FbnZpcm9ubWVudFYyQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24iHQobQXJjaGl2ZUVudmlyb25tZW50VjJDb21tYW5kIh8KHVVuYXJjaGl2ZUVudmlyb25tZW50VjJDb21tYW5kIpABChRDcmVhdGVQcm9qZWN0Q29tbWFuZBInCg9vcmdhbml6YXRpb25faWQYASABKAlSDm9yZ2FuaXphdGlvbklkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEhkKCHVybF9jb2RlGAQgASgJUgd1cmxDb2RlIpUBChlDcmVhdGVUcmlhbFByb2plY3RDb21tYW5kEhIKAmlkGAEgASgJQgIYAVICaWQSFAoFZW1haWwYAiABKAlSBWVtYWlsEhIKBG5hbWUYAyABKAlSBG5hbWUSGQoIdXJsX2NvZGUYBCABKAlSB3VybENvZGUSHwoLb3duZXJfZW1haWwYBSABKAlSCm93bmVyRW1haWwiKgoUUmVuYW1lUHJvamVjdENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZSJDCh9DaGFuZ2VEZXNjcmlwdGlvblByb2plY3RDb21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIWChRFbmFibGVQcm9qZWN0Q29tbWFuZCIXChVEaXNhYmxlUHJvamVjdENvbW1hbmQiHAoaQ29udmVydFRyaWFsUHJvamVjdENvbW1hbmQi0AEKGUNyZWF0ZU9yZ2FuaXphdGlvbkNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgCIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGQoIaXNfdHJpYWwYBCABKAhSB2lzVHJpYWwSJgoPaXNfc3lzdGVtX2FkbWluGAUgASgIUg1pc1N5c3RlbUFkbWluEh8KC293bmVyX2VtYWlsGAYgASgJUgpvd25lckVtYWlsIjMKHUNoYW5nZU5hbWVPcmdhbml6YXRpb25Db21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiSAokQ2hhbmdlRGVzY3JpcHRpb25Pcmdhbml6YXRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiJGCiNDaGFuZ2VPd25lckVtYWlsT3JnYW5pemF0aW9uQ29tbWFuZBIfCgtvd25lcl9lbWFpbBgBIAEoCVIKb3duZXJFbWFpbCJGChtDaGFuZ2VSZXF1aXJlQ29tbWVudENvbW1hbmQSJwoPcmVxdWlyZV9jb21tZW50GAEgASgIUg5yZXF1aXJlQ29tbWVudCIbChlFbmFibGVPcmdhbml6YXRpb25Db21tYW5kIhwKGkRpc2FibGVPcmdhbml6YXRpb25Db21tYW5kIhwKGkFyY2hpdmVPcmdhbml6YXRpb25Db21tYW5kIh4KHFVuYXJjaGl2ZU9yZ2FuaXphdGlvbkNvbW1hbmQiIQofQ29udmVydFRyaWFsT3JnYW5pemF0aW9uQ29tbWFuZEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwrnAwojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCLpAgoNRW52aXJvbm1lbnRWMhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SHQoKcHJvamVjdF9pZBgFIAEoCVIJcHJvamVjdElkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EicKD29yZ2FuaXphdGlvbl9pZBgJIAEoCVIOb3JnYW5pemF0aW9uSWQSJwoPcmVxdWlyZV9jb21tZW50GAogASgIUg5yZXF1aXJlQ29tbWVudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYCyABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKrwQKJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IrADCgxPcmdhbml6YXRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSFAoFdHJpYWwYByABKAhSBXRyaWFsEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQSIQoMc3lzdGVtX2FkbWluGAogASgIUgtzeXN0ZW1BZG1pbhIjCg1wcm9qZWN0X2NvdW50GAsgASgFUgxwcm9qZWN0Q291bnQSKwoRZW52aXJvbm1lbnRfY291bnQYDCABKAVSEGVudmlyb25tZW50Q291bnQSHQoKdXNlcl9jb3VudBgNIAEoBVIJdXNlckNvdW50Eh8KC293bmVyX2VtYWlsGA4gASgJUgpvd25lckVtYWlsQjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCv0DCh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQigwMKB1Byb2plY3QSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUSJwoPb3JnYW5pemF0aW9uX2lkGAogASgJUg5vcmdhbml6YXRpb25JZBIrChFlbnZpcm9ubWVudF9jb3VudBgLIAEoBVIQZW52aXJvbm1lbnRDb3VudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYDCABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKhgQKHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIiMKC0RvdWJsZVZhbHVlEhQKBXZhbHVlGAEgASgBUgV2YWx1ZSIiCgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZSIiCgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZSIjCgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWUiIgoKSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWUiIwoLVUludDMyVmFsdWUSFAoFdmFsdWUYASABKA1SBXZhbHVlIiEKCUJvb2xWYWx1ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWUiIwoLU3RyaW5nVmFsdWUSFAoFdmFsdWUYASABKAlSBXZhbHVlIiIKCkJ5dGVzVmFsdWUSFAoFdmFsdWUYASABKAxSBXZhbHVlQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqHBQoVZ29vZ2xlL2FwaS9odHRwLnByb3RvEgpnb29nbGUuYXBpInkKBEh0dHASKgoFcnVsZXMYASADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgVydWxlcxJFCh9mdWxseV9kZWNvZGVfcmVzZXJ2ZWRfZXhwYW5zaW9uGAIgASgIUhxmdWxseURlY29kZVJlc2VydmVkRXhwYW5zaW9uIrUCCghIdHRwUnVsZRIaCghzZWxlY3RvchgBIAEoCVIIc2VsZWN0b3ISEgoDZ2V0GAIgASgJSABSA2dldBISCgNwdXQYAyABKAlIAFIDcHV0EhQKBHBvc3QYBCABKAlIAFIEcG9zdBIYCgZkZWxldGUYBSABKAlIAFIGZGVsZXRlEhYKBXBhdGNoGAYgASgJSABSBXBhdGNoEjcKBmN1c3RvbRgIIAEoCzIdLmdvb2dsZS5hcGkuQ3VzdG9tSHR0cFBhdHRlcm5IAFIGY3VzdG9tEhIKBGJvZHkYByABKAlSBGJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8zCuFGCiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIk0KEUZpbGVEZXNjcmlwdG9yU2V0EjgKBGZpbGUYASADKAsyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1IEZmlsZSL+BAoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIYCgdlZGl0aW9uGA0gASgJUgdlZGl0aW9uIrkGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUaegoORXh0ZW5zaW9uUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kEkAKB29wdGlvbnMYAyABKAsyJi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zUgdvcHRpb25zGjcKDVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIq0EChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24SWQoLZGVjbGFyYXRpb24YAiADKAsyMi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uQgOIAQJSC2RlY2xhcmF0aW9uEmgKDHZlcmlmaWNhdGlvbhgDIAEoDjI4Lmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGU6ClVOVkVSSUZJRURSDHZlcmlmaWNhdGlvbhqzAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEiMKC2lzX3JlcGVhdGVkGAQgASgIQgIYAVIKaXNSZXBlYXRlZBIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFURUQQAyJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIpEJCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxI3ChRwaHBfZ2VuZXJpY19zZXJ2aWNlcxgqIAEoCDoFZmFsc2VSEnBocEdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECciuwMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKFCQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJKCgZ0YXJnZXQYEiABKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVCAhgBUgZ0YXJnZXQSSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFInMKDE9uZW9mT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpgCCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLQAgoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGusBCgpBbm5vdGF0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEh8KC3NvdXJjZV9maWxlGAIgASgJUgpzb3VyY2VGaWxlEhQKBWJlZ2luGAMgASgFUgViZWdpbhIQCgNlbmQYBCABKAVSA2VuZBJSCghzZW1hbnRpYxgFIAEoDjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLlNlbWFudGljUghzZW1hbnRpYyIoCghTZW1hbnRpYxIICgROT05FEAASBwoDU0VUEAESCQoFQUxJQVMQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCqgCChxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpGhVnb29nbGUvYXBpL2h0dHAucHJvdG8aIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr61wEKH3Byb3RvL2Vudmlyb25tZW50L3NlcnZpY2UucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudBoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvGh9wcm90by9lbnZpcm9ubWVudC9jb21tYW5kLnByb3RvIikKF0dldEVudmlyb25tZW50VjJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCJiChhHZXRFbnZpcm9ubWVudFYyUmVzcG9uc2USRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQixgQKGUxpc3RFbnZpcm9ubWVudHNWMlJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJTCghvcmRlcl9ieRgDIAEoDjI4LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0RW52aXJvbm1lbnRzVjJSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSaAoPb3JkZXJfZGlyZWN0aW9uGAQgASgOMj8uYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RFbnZpcm9ubWVudHNWMlJlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEh0KCnByb2plY3RfaWQYBSABKAlSCXByb2plY3RJZBI2CghhcmNoaXZlZBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEiUKDnNlYXJjaF9rZXl3b3JkGAcgASgJUg1zZWFyY2hLZXl3b3JkEicKD29yZ2FuaXphdGlvbl9pZBgIIAEoCVIOb3JnYW5pemF0aW9uSWQiaQoHT3JkZXJCeRILCgdERUZBVUxUEAASBgoCSUQQARIICgROQU1FEAISDAoIVVJMX0NPREUQAxIOCgpDUkVBVEVEX0FUEAQSDgoKVVBEQVRFRF9BVBAFEhEKDUZFQVRVUkVfQ09VTlQQBiIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEinwEKGkxpc3RFbnZpcm9ubWVudHNWMlJlc3BvbnNlEkgKDGVudmlyb25tZW50cxgBIAMoCzIkLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFYyUgxlbnZpcm9ubWVudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiaQoaQ3JlYXRlRW52aXJvbm1lbnRWMlJlcXVlc3QSSwoHY29tbWFuZBgBIAEoCzIxLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVFbnZpcm9ubWVudFYyQ29tbWFuZFIHY29tbWFuZCJlChtDcmVhdGVFbnZpcm9ubWVudFYyUmVzcG9uc2USRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQi+wIKGlVwZGF0ZUVudmlyb25tZW50VjJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJYCg5yZW5hbWVfY29tbWFuZBgCIAEoCzIxLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5SZW5hbWVFbnZpcm9ubWVudFYyQ29tbWFuZFINcmVuYW1lQ29tbWFuZBJ6ChpjaGFuZ2VfZGVzY3JpcHRpb25fY29tbWFuZBgDIAEoCzI8LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DaGFuZ2VEZXNjcmlwdGlvbkVudmlyb25tZW50VjJDb21tYW5kUhhjaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmQSdwoeY2hhbmdlX3JlcXVpcmVfY29tbWVudF9jb21tYW5kGAQgASgLMjIuYnVja2V0ZWVyLmVudmlyb25tZW50LkNoYW5nZVJlcXVpcmVDb21tZW50Q29tbWFuZFIbY2hhbmdlUmVxdWlyZUNvbW1lbnRDb21tYW5kIh0KG1VwZGF0ZUVudmlyb25tZW50VjJSZXNwb25zZSJ7ChtBcmNoaXZlRW52aXJvbm1lbnRWMlJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkwKB2NvbW1hbmQYAiABKAsyMi5idWNrZXRlZXIuZW52aXJvbm1lbnQuQXJjaGl2ZUVudmlyb25tZW50VjJDb21tYW5kUgdjb21tYW5kIh4KHEFyY2hpdmVFbnZpcm9ubWVudFYyUmVzcG9uc2UifwodVW5hcmNoaXZlRW52aXJvbm1lbnRWMlJlcXVlc3QSDgoCaWQYASABKAlSAmlkEk4KB2NvbW1hbmQYAiABKAsyNC5idWNrZXRlZXIuZW52aXJvbm1lbnQuVW5hcmNoaXZlRW52aXJvbm1lbnRWMkNvbW1hbmRSB2NvbW1hbmQiIAoeVW5hcmNoaXZlRW52aXJvbm1lbnRWMlJlc3BvbnNlIkwKEUdldFByb2plY3RSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkIk4KEkdldFByb2plY3RSZXNwb25zZRI4Cgdwcm9qZWN0GAEgASgLMh4uYnVja2V0ZWVyLmVudmlyb25tZW50LlByb2plY3RSB3Byb2plY3QiwgQKE0xpc3RQcm9qZWN0c1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJNCghvcmRlcl9ieRgDIAEoDjIyLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0UHJvamVjdHNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSYgoPb3JkZXJfZGlyZWN0aW9uGAQgASgOMjkuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RQcm9qZWN0c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSKQoQb3JnYW5pemF0aW9uX2lkcxgHIAMoCVIPb3JnYW5pemF0aW9uSWRzIpMBCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIGCgJJRBABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMSCAoETkFNRRAEEgwKCFVSTF9DT0RFEAUSFQoRRU5WSVJPTk1FTlRfQ09VTlQQBhIRCg1GRUFUVVJFX0NPVU5UEAcSEQoNQ1JFQVRPUl9FTUFJTBAIIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQASKLAQoUTGlzdFByb2plY3RzUmVzcG9uc2USOgoIcHJvamVjdHMYASADKAsyHi5idWNrZXRlZXIuZW52aXJvbm1lbnQuUHJvamVjdFIIcHJvamVjdHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiXQoUQ3JlYXRlUHJvamVjdFJlcXVlc3QSRQoHY29tbWFuZBgBIAEoCzIrLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVQcm9qZWN0Q29tbWFuZFIHY29tbWFuZCJRChVDcmVhdGVQcm9qZWN0UmVzcG9uc2USOAoHcHJvamVjdBgBIAEoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ugdwcm9qZWN0ImcKGUNyZWF0ZVRyaWFsUHJvamVjdFJlcXVlc3QSSgoHY29tbWFuZBgBIAEoCzIwLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVUcmlhbFByb2plY3RDb21tYW5kUgdjb21tYW5kIhwKGkNyZWF0ZVRyaWFsUHJvamVjdFJlc3BvbnNlIvABChRVcGRhdGVQcm9qZWN0UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSdAoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYAiABKAsyNi5idWNrZXRlZXIuZW52aXJvbm1lbnQuQ2hhbmdlRGVzY3JpcHRpb25Qcm9qZWN0Q29tbWFuZFIYY2hhbmdlRGVzY3JpcHRpb25Db21tYW5kElIKDnJlbmFtZV9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmVudmlyb25tZW50LlJlbmFtZVByb2plY3RDb21tYW5kUg1yZW5hbWVDb21tYW5kIhcKFVVwZGF0ZVByb2plY3RSZXNwb25zZSJtChRFbmFibGVQcm9qZWN0UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRQoHY29tbWFuZBgCIAEoCzIrLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbmFibGVQcm9qZWN0Q29tbWFuZFIHY29tbWFuZCIXChVFbmFibGVQcm9qZWN0UmVzcG9uc2UibwoVRGlzYWJsZVByb2plY3RSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJGCgdjb21tYW5kGAIgASgLMiwuYnVja2V0ZWVyLmVudmlyb25tZW50LkRpc2FibGVQcm9qZWN0Q29tbWFuZFIHY29tbWFuZCIYChZEaXNhYmxlUHJvamVjdFJlc3BvbnNlInkKGkNvbnZlcnRUcmlhbFByb2plY3RSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJLCgdjb21tYW5kGAIgASgLMjEuYnVja2V0ZWVyLmVudmlyb25tZW50LkNvbnZlcnRUcmlhbFByb2plY3RDb21tYW5kUgdjb21tYW5kIh0KG0NvbnZlcnRUcmlhbFByb2plY3RSZXNwb25zZSIoChZHZXRPcmdhbml6YXRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCJiChdHZXRPcmdhbml6YXRpb25SZXNwb25zZRJHCgxvcmdhbml6YXRpb24YASABKAsyIy5idWNrZXRlZXIuZW52aXJvbm1lbnQuT3JnYW5pemF0aW9uUgxvcmdhbml6YXRpb24i2wQKGExpc3RPcmdhbml6YXRpb25zUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yElIKCG9yZGVyX2J5GAMgASgOMjcuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmcKD29yZGVyX2RpcmVjdGlvbhgEIAEoDjI+LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0T3JnYW5pemF0aW9uc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSNgoIYXJjaGl2ZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghhcmNoaXZlZCKQAQoHT3JkZXJCeRILCgdERUZBVUxUEAASBgoCSUQQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBE5BTUUQBBIMCghVUkxfQ09ERRAFEhEKDVBST0pFQ1RfQ09VTlQQBhIVChFFTlZJUk9OTUVOVF9DT1VOVBAHEg4KClVTRVJfQ09VTlQQCCIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEinwEKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USSQoNT3JnYW5pemF0aW9ucxgBIAMoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDU9yZ2FuaXphdGlvbnMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQioAIKGUNyZWF0ZU9yZ2FuaXphdGlvblJlcXVlc3QSTgoHY29tbWFuZBgBIAEoCzIwLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVPcmdhbml6YXRpb25Db21tYW5kQgIYAVIHY29tbWFuZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIZCghpc190cmlhbBgFIAEoCFIHaXNUcmlhbBImCg9pc19zeXN0ZW1fYWRtaW4YBiABKAhSDWlzU3lzdGVtQWRtaW4SHwoLb3duZXJfZW1haWwYByABKAlSCm93bmVyRW1haWwiZQoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USRwoMT3JnYW5pemF0aW9uGAEgASgLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblIMT3JnYW5pemF0aW9uIvwCChlVcGRhdGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJbCg5yZW5hbWVfY29tbWFuZBgCIAEoCzI0LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DaGFuZ2VOYW1lT3JnYW5pemF0aW9uQ29tbWFuZFINcmVuYW1lQ29tbWFuZBJ5ChpjaGFuZ2VfZGVzY3JpcHRpb25fY29tbWFuZBgDIAEoCzI7LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DaGFuZ2VEZXNjcmlwdGlvbk9yZ2FuaXphdGlvbkNvbW1hbmRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBJ3ChpjaGFuZ2Vfb3duZXJfZW1haWxfY29tbWFuZBgEIAEoCzI6LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DaGFuZ2VPd25lckVtYWlsT3JnYW5pemF0aW9uQ29tbWFuZFIXY2hhbmdlT3duZXJFbWFpbENvbW1hbmQiHAoaVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UidwoZRW5hYmxlT3JnYW5pemF0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSSgoHY29tbWFuZBgCIAEoCzIwLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbmFibGVPcmdhbml6YXRpb25Db21tYW5kUgdjb21tYW5kIhwKGkVuYWJsZU9yZ2FuaXphdGlvblJlc3BvbnNlInkKGkRpc2FibGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJLCgdjb21tYW5kGAIgASgLMjEuYnVja2V0ZWVyLmVudmlyb25tZW50LkRpc2FibGVPcmdhbml6YXRpb25Db21tYW5kUgdjb21tYW5kIh0KG0Rpc2FibGVPcmdhbml6YXRpb25SZXNwb25zZSJ5ChpBcmNoaXZlT3JnYW5pemF0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSSwoHY29tbWFuZBgCIAEoCzIxLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5BcmNoaXZlT3JnYW5pemF0aW9uQ29tbWFuZFIHY29tbWFuZCIdChtBcmNoaXZlT3JnYW5pemF0aW9uUmVzcG9uc2UifQocVW5hcmNoaXZlT3JnYW5pemF0aW9uUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSTQoHY29tbWFuZBgCIAEoCzIzLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5VbmFyY2hpdmVPcmdhbml6YXRpb25Db21tYW5kUgdjb21tYW5kIh8KHVVuYXJjaGl2ZU9yZ2FuaXphdGlvblJlc3BvbnNlIoMBCh9Db252ZXJ0VHJpYWxPcmdhbml6YXRpb25SZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJQCgdjb21tYW5kGAIgASgLMjYuYnVja2V0ZWVyLmVudmlyb25tZW50LkNvbnZlcnRUcmlhbE9yZ2FuaXphdGlvbkNvbW1hbmRSB2NvbW1hbmQiIgogQ29udmVydFRyaWFsT3JnYW5pemF0aW9uUmVzcG9uc2Ui9QQKFUxpc3RQcm9qZWN0c1YyUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEk8KCG9yZGVyX2J5GAMgASgOMjQuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RQcm9qZWN0c1YyUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmQKD29yZGVyX2RpcmVjdGlvbhgEIAEoDjI7LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0UHJvamVjdHNWMlJlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSLQoQb3JnYW5pemF0aW9uX2lkcxgHIAMoCUICGAFSD29yZ2FuaXphdGlvbklkcxInCg9vcmdhbml6YXRpb25faWQYCCABKAlSDm9yZ2FuaXphdGlvbklkIpMBCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIGCgJJRBABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMSCAoETkFNRRAEEgwKCFVSTF9DT0RFEAUSFQoRRU5WSVJPTk1FTlRfQ09VTlQQBhIRCg1GRUFUVVJFX0NPVU5UEAcSEQoNQ1JFQVRPUl9FTUFJTBAIIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQASKNAQoWTGlzdFByb2plY3RzVjJSZXNwb25zZRI6Cghwcm9qZWN0cxgBIAMoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ughwcm9qZWN0cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudDKmngEKEkVudmlyb25tZW50U2VydmljZRK3BgoQR2V0RW52aXJvbm1lbnRWMhIuLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5HZXRFbnZpcm9ubWVudFYyUmVxdWVzdBovLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5HZXRFbnZpcm9ubWVudFYyUmVzcG9uc2UiwQWSQZYFCgtFbnZpcm9ubWVudBIDR2V0GkZHZXQgYW4gZW52aXJvbm1lbnQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKiJ3ZWIudjEuZW52aXJvbm1lbnQuZ2V0X2Vudmlyb25tZW50SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiESHy92MS9lbnZpcm9ubWVudC9nZXRfZW52aXJvbm1lbnQSwQYKEkxpc3RFbnZpcm9ubWVudHNWMhIwLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0RW52aXJvbm1lbnRzVjJSZXF1ZXN0GjEuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RFbnZpcm9ubWVudHNWMlJlc3BvbnNlIsUFkkGYBQoLRW52aXJvbm1lbnQSBExpc3QaRUxpc3QgZW52aXJvbm1lbnRzLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiokd2ViLnYxLmVudmlyb25tZW50Lmxpc3RfZW52aXJvbm1lbnRzSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiMSIS92MS9lbnZpcm9ubWVudC9saXN0X2Vudmlyb25tZW50cxLPBgoTQ3JlYXRlRW52aXJvbm1lbnRWMhIxLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVFbnZpcm9ubWVudFYyUmVxdWVzdBoyLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVFbnZpcm9ubWVudFYyUmVzcG9uc2Ui0AWSQZ8FCgtFbnZpcm9ubWVudBIGQ3JlYXRlGklDcmVhdGUgYW4gZW52aXJvbm1lbnQuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKiV3ZWIudjEuZW52aXJvbm1lbnQuY3JlYXRlX2Vudmlyb25tZW50SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiciIi92MS9lbnZpcm9ubWVudC9jcmVhdGVfZW52aXJvbm1lbnQ6ASoSzwYKE1VwZGF0ZUVudmlyb25tZW50VjISMS5idWNrZXRlZXIuZW52aXJvbm1lbnQuVXBkYXRlRW52aXJvbm1lbnRWMlJlcXVlc3QaMi5idWNrZXRlZXIuZW52aXJvbm1lbnQuVXBkYXRlRW52aXJvbm1lbnRWMlJlc3BvbnNlItAFkkGfBQoLRW52aXJvbm1lbnQSBlVwZGF0ZRpJVXBkYXRlIGFuIGVudmlyb25tZW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiold2ViLnYxLmVudmlyb25tZW50LnVwZGF0ZV9lbnZpcm9ubWVudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwInIiIvdjEvZW52aXJvbm1lbnQvdXBkYXRlX2Vudmlyb25tZW50OgEqEtYGChRBcmNoaXZlRW52aXJvbm1lbnRWMhIyLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5BcmNoaXZlRW52aXJvbm1lbnRWMlJlcXVlc3QaMy5idWNrZXRlZXIuZW52aXJvbm1lbnQuQXJjaGl2ZUVudmlyb25tZW50VjJSZXNwb25zZSLUBZJBogUKC0Vudmlyb25tZW50EgdBcmNoaXZlGkpBcmNoaXZlIGFuIGVudmlyb25tZW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiomd2ViLnYxLmVudmlyb25tZW50LmFyY2hpdmVfZW52aXJvbm1lbnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCKCIjL3YxL2Vudmlyb25tZW50L2FyY2hpdmVfZW52aXJvbm1lbnQ6ASoS5AYKFlVuYXJjaGl2ZUVudmlyb25tZW50VjISNC5idWNrZXRlZXIuZW52aXJvbm1lbnQuVW5hcmNoaXZlRW52aXJvbm1lbnRWMlJlcXVlc3QaNS5idWNrZXRlZXIuZW52aXJvbm1lbnQuVW5hcmNoaXZlRW52aXJvbm1lbnRWMlJlc3BvbnNlItwFkkGoBQoLRW52aXJvbm1lbnQSCVVuYXJjaGl2ZRpMVW5hcmNoaXZlIGFuIGVudmlyb25tZW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiood2ViLnYxLmVudmlyb25tZW50LnVuYXJjaGl2ZV9lbnZpcm9ubWVudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIqIiUvdjEvZW52aXJvbm1lbnQvdW5hcmNoaXZlX2Vudmlyb25tZW50OgEqEpQGCgpHZXRQcm9qZWN0EiguYnVja2V0ZWVyLmVudmlyb25tZW50LkdldFByb2plY3RSZXF1ZXN0GikuYnVja2V0ZWVyLmVudmlyb25tZW50LkdldFByb2plY3RSZXNwb25zZSKwBZJBiQUKB1Byb2plY3QSA0dldBpBR2V0IGEgcHJvamVjdC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qHndlYi52MS5lbnZpcm9ubWVudC5nZXRfcHJvamVjdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIdEhsvdjEvZW52aXJvbm1lbnQvZ2V0X3Byb2plY3QSnwYKDExpc3RQcm9qZWN0cxIqLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0UHJvamVjdHNSZXF1ZXN0GisuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RQcm9qZWN0c1Jlc3BvbnNlIrUFkkGMBQoHUHJvamVjdBIETGlzdBpBTGlzdCBwcm9qZWN0cy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qIHdlYi52MS5lbnZpcm9ubWVudC5saXN0X3Byb2plY3RzSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8SHS92MS9lbnZpcm9ubWVudC9saXN0X3Byb2plY3RzEqwGCg1DcmVhdGVQcm9qZWN0EisuYnVja2V0ZWVyLmVudmlyb25tZW50LkNyZWF0ZVByb2plY3RSZXF1ZXN0GiwuYnVja2V0ZWVyLmVudmlyb25tZW50LkNyZWF0ZVByb2plY3RSZXNwb25zZSK/BZJBkgUKB1Byb2plY3QSBkNyZWF0ZRpEQ3JlYXRlIGEgcHJvamVjdC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qIXdlYi52MS5lbnZpcm9ubWVudC5jcmVhdGVfcHJvamVjdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIjIh4vdjEvZW52aXJvbm1lbnQvY3JlYXRlX3Byb2plY3Q6ASoS0wYKEkNyZWF0ZVRyaWFsUHJvamVjdBIwLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5DcmVhdGVUcmlhbFByb2plY3RSZXF1ZXN0GjEuYnVja2V0ZWVyLmVudmlyb25tZW50LkNyZWF0ZVRyaWFsUHJvamVjdFJlc3BvbnNlItcFkkGkBQoHUHJvamVjdBIMQ3JlYXRlIFRyaWFsGkpDcmVhdGUgYSB0cmlhbCBwcm9qZWN0LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiond2ViLnYxLmVudmlyb25tZW50LmNyZWF0ZV90cmlhbF9wcm9qZWN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAikiJC92MS9lbnZpcm9ubWVudC9jcmVhdGVfdHJpYWxfcHJvamVjdDoBKhKsBgoNVXBkYXRlUHJvamVjdBIrLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5VcGRhdGVQcm9qZWN0UmVxdWVzdBosLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5VcGRhdGVQcm9qZWN0UmVzcG9uc2UivwWSQZIFCgdQcm9qZWN0EgZVcGRhdGUaRFVwZGF0ZSBhIHByb2plY3QuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKiF3ZWIudjEuZW52aXJvbm1lbnQudXBkYXRlX3Byb2plY3RKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCIyIeL3YxL2Vudmlyb25tZW50L3VwZGF0ZV9wcm9qZWN0OgEqEqwGCg1FbmFibGVQcm9qZWN0EisuYnVja2V0ZWVyLmVudmlyb25tZW50LkVuYWJsZVByb2plY3RSZXF1ZXN0GiwuYnVja2V0ZWVyLmVudmlyb25tZW50LkVuYWJsZVByb2plY3RSZXNwb25zZSK/BZJBkgUKB1Byb2plY3QSBkVuYWJsZRpERW5hYmxlIGEgcHJvamVjdC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qIXdlYi52MS5lbnZpcm9ubWVudC5lbmFibGVfcHJvamVjdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIjIh4vdjEvZW52aXJvbm1lbnQvZW5hYmxlX3Byb2plY3Q6ASoSswYKDkRpc2FibGVQcm9qZWN0EiwuYnVja2V0ZWVyLmVudmlyb25tZW50LkRpc2FibGVQcm9qZWN0UmVxdWVzdBotLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5EaXNhYmxlUHJvamVjdFJlc3BvbnNlIsMFkkGVBQoHUHJvamVjdBIHRGlzYWJsZRpFRGlzYWJsZSBhIHByb2plY3QuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKiJ3ZWIudjEuZW52aXJvbm1lbnQuZGlzYWJsZV9wcm9qZWN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiQiHy92MS9lbnZpcm9ubWVudC9kaXNhYmxlX3Byb2plY3Q6ASoS2gYKE0NvbnZlcnRUcmlhbFByb2plY3QSMS5idWNrZXRlZXIuZW52aXJvbm1lbnQuQ29udmVydFRyaWFsUHJvamVjdFJlcXVlc3QaMi5idWNrZXRlZXIuZW52aXJvbm1lbnQuQ29udmVydFRyaWFsUHJvamVjdFJlc3BvbnNlItsFkkGnBQoHUHJvamVjdBINQ29udmVydCBUcmlhbBpLQ29udmVydCBhIHRyaWFsIHByb2plY3QuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKih3ZWIudjEuZW52aXJvbm1lbnQuY29udmVydF90cmlhbF9wcm9qZWN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAioiJS92MS9lbnZpcm9ubWVudC9jb252ZXJ0X3RyaWFsX3Byb2plY3Q6ASoSuAYKD0dldE9yZ2FuaXphdGlvbhItLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5HZXRPcmdhbml6YXRpb25SZXF1ZXN0Gi4uYnVja2V0ZWVyLmVudmlyb25tZW50LkdldE9yZ2FuaXphdGlvblJlc3BvbnNlIsUFkkGZBQoMT3JnYW5pemF0aW9uEgNHZXQaR0dldCBhbiBvcmdhbml6YXRpb24uIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGF0IGxlYXN0IGEgTUVNQkVSIHJvbGUuKiN3ZWIudjEuZW52aXJvbm1lbnQuZ2V0X29yZ2FuaXphdGlvbkq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIiEiAvdjEvZW52aXJvbm1lbnQvZ2V0X29yZ2FuaXphdGlvbhLCBgoRTGlzdE9yZ2FuaXphdGlvbnMSLy5idWNrZXRlZXIuZW52aXJvbm1lbnQuTGlzdE9yZ2FuaXphdGlvbnNSZXF1ZXN0GjAuYnVja2V0ZWVyLmVudmlyb25tZW50Lkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UiyQWSQZsFCgxPcmdhbml6YXRpb24SBExpc3QaRkxpc3Qgb3JnYW5pemF0aW9ucy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qJXdlYi52MS5lbnZpcm9ubWVudC5saXN0X29yZ2FuaXphdGlvbnNKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJBIiL3YxL2Vudmlyb25tZW50L2xpc3Rfb3JnYW5pemF0aW9ucxLQBgoSQ3JlYXRlT3JnYW5pemF0aW9uEjAuYnVja2V0ZWVyLmVudmlyb25tZW50LkNyZWF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaMS5idWNrZXRlZXIuZW52aXJvbm1lbnQuQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2Ui1AWSQaIFCgxPcmdhbml6YXRpb24SBkNyZWF0ZRpKQ3JlYXRlIGFuIG9yZ2FuaXphdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qJndlYi52MS5lbnZpcm9ubWVudC5jcmVhdGVfb3JnYW5pemF0aW9uSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAigiIy92MS9lbnZpcm9ubWVudC9jcmVhdGVfb3JnYW5pemF0aW9uOgEqEskGChJVcGRhdGVPcmdhbml6YXRpb24SMC5idWNrZXRlZXIuZW52aXJvbm1lbnQuVXBkYXRlT3JnYW5pemF0aW9uUmVxdWVzdBoxLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5VcGRhdGVPcmdhbml6YXRpb25SZXNwb25zZSLNBZJBmwUKDE9yZ2FuaXphdGlvbhIGVXBkYXRlGkNVcGRhdGUgYW4gb3JnYW5pemF0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKiZ3ZWIudjEuZW52aXJvbm1lbnQudXBkYXRlX29yZ2FuaXphdGlvbkq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIoIiMvdjEvZW52aXJvbm1lbnQvdXBkYXRlX29yZ2FuaXphdGlvbjoBKhLQBgoSRW5hYmxlT3JnYW5pemF0aW9uEjAuYnVja2V0ZWVyLmVudmlyb25tZW50LkVuYWJsZU9yZ2FuaXphdGlvblJlcXVlc3QaMS5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW5hYmxlT3JnYW5pemF0aW9uUmVzcG9uc2Ui1AWSQaIFCgxPcmdhbml6YXRpb24SBkVuYWJsZRpKRW5hYmxlIGFuIG9yZ2FuaXphdGlvbi4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYFNZU1RFTV9BRE1JTmAgcm9sZS4qJndlYi52MS5lbnZpcm9ubWVudC5lbmFibGVfb3JnYW5pemF0aW9uSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAigiIy92MS9lbnZpcm9ubWVudC9lbmFibGVfb3JnYW5pemF0aW9uOgEqEtcGChNEaXNhYmxlT3JnYW5pemF0aW9uEjEuYnVja2V0ZWVyLmVudmlyb25tZW50LkRpc2FibGVPcmdhbml6YXRpb25SZXF1ZXN0GjIuYnVja2V0ZWVyLmVudmlyb25tZW50LkRpc2FibGVPcmdhbml6YXRpb25SZXNwb25zZSLYBZJBpQUKDE9yZ2FuaXphdGlvbhIHRGlzYWJsZRpLRGlzYWJsZSBhbiBvcmdhbml6YXRpb24uIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKid3ZWIudjEuZW52aXJvbm1lbnQuZGlzYWJsZV9vcmdhbml6YXRpb25KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCKSIkL3YxL2Vudmlyb25tZW50L2Rpc2FibGVfb3JnYW5pemF0aW9uOgEqEtcGChNBcmNoaXZlT3JnYW5pemF0aW9uEjEuYnVja2V0ZWVyLmVudmlyb25tZW50LkFyY2hpdmVPcmdhbml6YXRpb25SZXF1ZXN0GjIuYnVja2V0ZWVyLmVudmlyb25tZW50LkFyY2hpdmVPcmdhbml6YXRpb25SZXNwb25zZSLYBZJBpQUKDE9yZ2FuaXphdGlvbhIHQXJjaGl2ZRpLQXJjaGl2ZSBhbiBvcmdhbml6YXRpb24uIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKid3ZWIudjEuZW52aXJvbm1lbnQuYXJjaGl2ZV9vcmdhbml6YXRpb25KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCKSIkL3YxL2Vudmlyb25tZW50L2FyY2hpdmVfb3JnYW5pemF0aW9uOgEqEuUGChVVbmFyY2hpdmVPcmdhbml6YXRpb24SMy5idWNrZXRlZXIuZW52aXJvbm1lbnQuVW5hcmNoaXZlT3JnYW5pemF0aW9uUmVxdWVzdBo0LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5VbmFyY2hpdmVPcmdhbml6YXRpb25SZXNwb25zZSLgBZJBqwUKDE9yZ2FuaXphdGlvbhIJVW5hcmNoaXZlGk1VbmFyY2hpdmUgYW4gb3JnYW5pemF0aW9uLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgU1lTVEVNX0FETUlOYCByb2xlLiopd2ViLnYxLmVudmlyb25tZW50LnVuYXJjaGl2ZV9vcmdhbml6YXRpb25KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCKyImL3YxL2Vudmlyb25tZW50L3VuYXJjaGl2ZV9vcmdhbml6YXRpb246ASoSiwcKGENvbnZlcnRUcmlhbE9yZ2FuaXphdGlvbhI2LmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Db252ZXJ0VHJpYWxPcmdhbml6YXRpb25SZXF1ZXN0GjcuYnVja2V0ZWVyLmVudmlyb25tZW50LkNvbnZlcnRUcmlhbE9yZ2FuaXphdGlvblJlc3BvbnNlIv0FkkHEBQoMT3JnYW5pemF0aW9uEg1Db252ZXJ0IFRyaWFsGl5Db252ZXJ0IGEgdHJpYWwgb3JnYW5pemF0aW9uIHRvIGEgcGFpZCBvbmUuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBTWVNURU1fQURNSU5gIHJvbGUuKi13ZWIudjEuZW52aXJvbm1lbnQuY29udmVydF90cmlhbF9vcmdhbml6YXRpb25KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCLyIqL3YxL2Vudmlyb25tZW50L2NvbnZlcnRfdHJpYWxfb3JnYW5pemF0aW9uOgEqEuIGCg5MaXN0UHJvamVjdHNWMhIsLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5MaXN0UHJvamVjdHNWMlJlcXVlc3QaLS5idWNrZXRlZXIuZW52aXJvbm1lbnQuTGlzdFByb2plY3RzVjJSZXNwb25zZSLyBZJBxgUKB1Byb2plY3QSEExpc3QgUHJvamVjdHMgVjIabExpc3QgcHJvamVjdHMgd2l0aCBWMiBBUEkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGF0IGxlYXN0IGEgTUVNQkVSIHJvbGUgaW4gdGhlIHNwZWNpZmllZCBvcmdhbml6YXRpb25zLiojd2ViLnYxLmVudmlyb25tZW50Lmxpc3RfcHJvamVjdHNfdjJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCIhIgL3YxL2Vudmlyb25tZW50L2xpc3RfcHJvamVjdHNfdjJCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzM=
- experimentDescriptor: CqwHCh5wcm90by9leHBlcmltZW50L2NvbW1hbmQucHJvdG8SFGJ1Y2tldGVlci5leHBlcmltZW50IlkKEUNyZWF0ZUdvYWxDb21tYW5kEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbiInChFSZW5hbWVHb2FsQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIkAKHENoYW5nZURlc2NyaXB0aW9uR29hbENvbW1hbmQSIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uIhQKEkFyY2hpdmVHb2FsQ29tbWFuZCITChFEZWxldGVHb2FsQ29tbWFuZCLvAQoXQ3JlYXRlRXhwZXJpbWVudENvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhkKCHN0YXJ0X2F0GAMgASgDUgdzdGFydEF0EhcKB3N0b3BfYXQYBCABKANSBnN0b3BBdBIZCghnb2FsX2lkcxgFIAMoCVIHZ29hbElkcxISCgRuYW1lGAYgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAcgASgJUgtkZXNjcmlwdGlvbhIqChFiYXNlX3ZhcmlhdGlvbl9pZBgIIAEoCVIPYmFzZVZhcmlhdGlvbklkSgQIAhADIlMKHUNoYW5nZUV4cGVyaW1lbnRQZXJpb2RDb21tYW5kEhkKCHN0YXJ0X2F0GAEgASgDUgdzdGFydEF0EhcKB3N0b3BfYXQYAiABKANSBnN0b3BBdCIxChtDaGFuZ2VFeHBlcmltZW50TmFtZUNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZSJGCiJDaGFuZ2VFeHBlcmltZW50RGVzY3JpcHRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIXChVTdG9wRXhwZXJpbWVudENvbW1hbmQiGgoYQXJjaGl2ZUV4cGVyaW1lbnRDb21tYW5kIhkKF0RlbGV0ZUV4cGVyaW1lbnRDb21tYW5kIhgKFlN0YXJ0RXhwZXJpbWVudENvbW1hbmQiGQoXRmluaXNoRXhwZXJpbWVudENvbW1hbmRCNFoyZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V4cGVyaW1lbnRiBnByb3RvMwrWAQodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlImcKCVZhcmlhdGlvbhIOCgJpZBgBIAEoCVICaWQSFAoFdmFsdWUYAiABKAlSBXZhbHVlEhIKBG5hbWUYAyABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKvAcKIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90bxIUYnVja2V0ZWVyLmV4cGVyaW1lbnQaHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvItAFCgpFeHBlcmltZW50Eg4KAmlkGAEgASgJUgJpZBIbCgdnb2FsX2lkGAIgASgJQgIYAVIGZ29hbElkEh0KCmZlYXR1cmVfaWQYAyABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBCABKAVSDmZlYXR1cmVWZXJzaW9uEjwKCnZhcmlhdGlvbnMYBSADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSGQoIc3RhcnRfYXQYBiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgHIAEoA1IGc3RvcEF0EhwKB3N0b3BwZWQYCCABKAhCAhgBUgdzdG9wcGVkEiEKCnN0b3BwZWRfYXQYCSABKANCAjABUglzdG9wcGVkQXQSHQoKY3JlYXRlZF9hdBgKIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCyABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAwgASgIUgdkZWxldGVkEhkKCGdvYWxfaWRzGA0gAygJUgdnb2FsSWRzEhIKBG5hbWUYDiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YDyABKAlSC2Rlc2NyaXB0aW9uEioKEWJhc2VfdmFyaWF0aW9uX2lkGBAgASgJUg9iYXNlVmFyaWF0aW9uSWQSPwoGc3RhdHVzGBIgASgOMicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudC5TdGF0dXNSBnN0YXR1cxIeCgptYWludGFpbmVyGBMgASgJUgptYWludGFpbmVyEhoKCGFyY2hpdmVkGBQgASgIUghhcmNoaXZlZCJCCgZTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARILCgdTVE9QUEVEEAISEQoNRk9SQ0VfU1RPUFBFRBADSgQIERASIlEKC0V4cGVyaW1lbnRzEkIKC2V4cGVyaW1lbnRzGAEgAygLMiAuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudFILZXhwZXJpbWVudHNCNFoyZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V4cGVyaW1lbnRiBnByb3RvMwrdAgobcHJvdG8vZXhwZXJpbWVudC9nb2FsLnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudCLpAQoER29hbBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGAoHZGVsZXRlZBgEIAEoCFIHZGVsZXRlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0EicKEGlzX2luX3VzZV9zdGF0dXMYByABKAhSDWlzSW5Vc2VTdGF0dXMSGgoIYXJjaGl2ZWQYCCABKAhSCGFyY2hpdmVkQjRaMmdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9leHBlcmltZW50YgZwcm90bzMKhwUKFWdvb2dsZS9hcGkvaHR0cC5wcm90bxIKZ29vZ2xlLmFwaSJ5CgRIdHRwEioKBXJ1bGVzGAEgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIFcnVsZXMSRQofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCFIcZnVsbHlEZWNvZGVSZXNlcnZlZEV4cGFuc2lvbiK1AgoISHR0cFJ1bGUSGgoIc2VsZWN0b3IYASABKAlSCHNlbGVjdG9yEhIKA2dldBgCIAEoCUgAUgNnZXQSEgoDcHV0GAMgASgJSABSA3B1dBIUCgRwb3N0GAQgASgJSABSBHBvc3QSGAoGZGVsZXRlGAUgASgJSABSBmRlbGV0ZRIWCgVwYXRjaBgGIAEoCUgAUgVwYXRjaBI3CgZjdXN0b20YCCABKAsyHS5nb29nbGUuYXBpLkN1c3RvbUh0dHBQYXR0ZXJuSABSBmN1c3RvbRISCgRib2R5GAcgASgJUgRib2R5EkUKE2FkZGl0aW9uYWxfYmluZGluZ3MYCyADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUhJhZGRpdGlvbmFsQmluZGluZ3NCCQoHcGF0dGVybiI7ChFDdXN0b21IdHRwUGF0dGVybhISCgRraW5kGAEgASgJUgRraW5kEhIKBHBhdGgYAiABKAlSBHBhdGhCagoOY29tLmdvb2dsZS5hcGlCCUh0dHBQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc/gBAaICBEdBUEliBnByb3RvMwrhRgogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJNChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUi/gQKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSGAoHZWRpdGlvbhgNIAEoCVIHZWRpdGlvbiK5BgoPRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSOwoFZmllbGQYAiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SBWZpZWxkEkMKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEkEKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1IKbmVzdGVkVHlwZRJBCgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSWAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVIOZXh0ZW5zaW9uUmFuZ2USRAoKb25lb2ZfZGVjbBgIIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1IJb25lb2ZEZWNsEjkKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNSB29wdGlvbnMSVQoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgKIAMoCVIMcmVzZXJ2ZWROYW1lGnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKtBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhJoCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEUgx2ZXJpZmljYXRpb24aswEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIjCgtpc19yZXBlYXRlZBgEIAEoCEICGAFSCmlzUmVwZWF0ZWQSGgoIcmVzZXJ2ZWQYBSABKAhSCHJlc2VydmVkEhoKCHJlcGVhdGVkGAYgASgIUghyZXBlYXRlZCI0ChFWZXJpZmljYXRpb25TdGF0ZRIPCgtERUNMQVJBVElPThAAEg4KClVOVkVSSUZJRUQQASoJCOgHEICAgIACIsEGChRGaWVsZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgDIAEoBVIGbnVtYmVyEkEKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsUgVsYWJlbBI+CgR0eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSBHR5cGUSGwoJdHlwZV9uYW1lGAYgASgJUgh0eXBlTmFtZRIaCghleHRlbmRlZRgCIAEoCVIIZXh0ZW5kZWUSIwoNZGVmYXVsdF92YWx1ZRgHIAEoCVIMZGVmYXVsdFZhbHVlEh8KC29uZW9mX2luZGV4GAkgASgFUgpvbmVvZkluZGV4EhsKCWpzb25fbmFtZRgKIAEoCVIIanNvbk5hbWUSNwoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNSB29wdGlvbnMSJwoPcHJvdG8zX29wdGlvbmFsGBEgASgIUg5wcm90bzNPcHRpb25hbCK2AgoEVHlwZRIPCgtUWVBFX0RPVUJMRRABEg4KClRZUEVfRkxPQVQQAhIOCgpUWVBFX0lOVDY0EAMSDwoLVFlQRV9VSU5UNjQQBBIOCgpUWVBFX0lOVDMyEAUSEAoMVFlQRV9GSVhFRDY0EAYSEAoMVFlQRV9GSVhFRDMyEAcSDQoJVFlQRV9CT09MEAgSDwoLVFlQRV9TVFJJTkcQCRIOCgpUWVBFX0dST1VQEAoSEAoMVFlQRV9NRVNTQUdFEAsSDgoKVFlQRV9CWVRFUxAMEg8KC1RZUEVfVUlOVDMyEA0SDQoJVFlQRV9FTlVNEA4SEQoNVFlQRV9TRklYRUQzMhAPEhEKDVRZUEVfU0ZJWEVENjQQEBIPCgtUWVBFX1NJTlQzMhAREg8KC1RZUEVfU0lOVDY0EBIiQwoFTGFiZWwSEgoOTEFCRUxfT1BUSU9OQUwQARISCg5MQUJFTF9SRVFVSVJFRBACEhIKDkxBQkVMX1JFUEVBVEVEEAMiYwoUT25lb2ZEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI3CgdvcHRpb25zGAIgASgLMh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1IHb3B0aW9ucyLjAgoTRW51bURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj8KBXZhbHVlGAIgAygLMikuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1IFdmFsdWUSNgoHb3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1IHb3B0aW9ucxJdCg5yZXNlcnZlZF9yYW5nZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYBSADKAlSDHJlc2VydmVkTmFtZRo7ChFFbnVtUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQigwEKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgCIAEoBVIGbnVtYmVyEjsKB29wdGlvbnMYAyABKAsyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1IHb3B0aW9ucyKnAQoWU2VydmljZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj4KBm1ldGhvZBgCIAMoCzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9SBm1ldGhvZBI5CgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zUgdvcHRpb25zIokCChVNZXRob2REZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIdCgppbnB1dF90eXBlGAIgASgJUglpbnB1dFR5cGUSHwoLb3V0cHV0X3R5cGUYAyABKAlSCm91dHB1dFR5cGUSOAoHb3B0aW9ucxgEIAEoCzIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zUgdvcHRpb25zEjAKEGNsaWVudF9zdHJlYW1pbmcYBSABKAg6BWZhbHNlUg9jbGllbnRTdHJlYW1pbmcSMAoQc2VydmVyX3N0cmVhbWluZxgGIAEoCDoFZmFsc2VSD3NlcnZlclN0cmVhbWluZyKRCQoLRmlsZU9wdGlvbnMSIQoMamF2YV9wYWNrYWdlGAEgASgJUgtqYXZhUGFja2FnZRIwChRqYXZhX291dGVyX2NsYXNzbmFtZRgIIAEoCVISamF2YU91dGVyQ2xhc3NuYW1lEjUKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlUhFqYXZhTXVsdGlwbGVGaWxlcxJECh1qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaBgUIAEoCEICGAFSGWphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gSOgoWamF2YV9zdHJpbmdfY2hlY2tfdXRmOBgbIAEoCDoFZmFsc2VSE2phdmFTdHJpbmdDaGVja1V0ZjgSUwoMb3B0aW1pemVfZm9yGAkgASgOMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZToFU1BFRURSC29wdGltaXplRm9yEh0KCmdvX3BhY2thZ2UYCyABKAlSCWdvUGFja2FnZRI1ChNjY19nZW5lcmljX3NlcnZpY2VzGBAgASgIOgVmYWxzZVIRY2NHZW5lcmljU2VydmljZXMSOQoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZVITamF2YUdlbmVyaWNTZXJ2aWNlcxI1ChNweV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZVIRcHlHZW5lcmljU2VydmljZXMSNwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZhbHNlUhJwaHBHZW5lcmljU2VydmljZXMSJQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSLgoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoEdHJ1ZVIOY2NFbmFibGVBcmVuYXMSKgoRb2JqY19jbGFzc19wcmVmaXgYJCABKAlSD29iamNDbGFzc1ByZWZpeBIpChBjc2hhcnBfbmFtZXNwYWNlGCUgASgJUg9jc2hhcnBOYW1lc3BhY2USIQoMc3dpZnRfcHJlZml4GCcgASgJUgtzd2lmdFByZWZpeBIoChBwaHBfY2xhc3NfcHJlZml4GCggASgJUg5waHBDbGFzc1ByZWZpeBIjCg1waHBfbmFtZXNwYWNlGCkgASgJUgxwaHBOYW1lc3BhY2USNAoWcGhwX21ldGFkYXRhX25hbWVzcGFjZRgsIAEoCVIUcGhwTWV0YWRhdGFOYW1lc3BhY2USIQoMcnVieV9wYWNrYWdlGC0gASgJUgtydWJ5UGFja2FnZRJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiI6CgxPcHRpbWl6ZU1vZGUSCQoFU1BFRUQQARINCglDT0RFX1NJWkUQAhIQCgxMSVRFX1JVTlRJTUUQAyoJCOgHEICAgIACSgQIJhAnIrsDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoihQkKDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSgoGdGFyZ2V0GBIgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlQgIYAVIGdGFyZ2V0EkgKB3RhcmdldHMYEyADKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVSB3RhcmdldHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iLwoFQ1R5cGUSCgoGU1RSSU5HEAASCAoEQ09SRBABEhAKDFNUUklOR19QSUVDRRACIjUKBkpTVHlwZRINCglKU19OT1JNQUwQABINCglKU19TVFJJTkcQARINCglKU19OVU1CRVIQAiJVCg9PcHRpb25SZXRlbnRpb24SFQoRUkVURU5USU9OX1VOS05PV04QABIVChFSRVRFTlRJT05fUlVOVElNRRABEhQKEFJFVEVOVElPTl9TT1VSQ0UQAiKMAgoQT3B0aW9uVGFyZ2V0VHlwZRIXChNUQVJHRVRfVFlQRV9VTktOT1dOEAASFAoQVEFSR0VUX1RZUEVfRklMRRABEh8KG1RBUkdFVF9UWVBFX0VYVEVOU0lPTl9SQU5HRRACEhcKE1RBUkdFVF9UWVBFX01FU1NBR0UQAxIVChFUQVJHRVRfVFlQRV9GSUVMRBAEEhUKEVRBUkdFVF9UWVBFX09ORU9GEAUSFAoQVEFSR0VUX1RZUEVfRU5VTRAGEhoKFlRBUkdFVF9UWVBFX0VOVU1fRU5UUlkQBxIXChNUQVJHRVRfVFlQRV9TRVJWSUNFEAgSFgoSVEFSR0VUX1RZUEVfTUVUSE9EEAkqCQjoBxCAgICAAkoECAQQBSJzCgxPbmVvZk9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKYAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYingEKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKcAQoOU2VydmljZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLgAgoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnAgoOU291cmNlQ29kZUluZm8SRAoIbG9jYXRpb24YASADKAsyKC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25SCGxvY2F0aW9uGs4BCghMb2NhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIWCgRzcGFuGAIgAygFQgIQAVIEc3BhbhIpChBsZWFkaW5nX2NvbW1lbnRzGAMgASgJUg9sZWFkaW5nQ29tbWVudHMSKwoRdHJhaWxpbmdfY29tbWVudHMYBCABKAlSEHRyYWlsaW5nQ29tbWVudHMSOgoZbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cxgGIAMoCVIXbGVhZGluZ0RldGFjaGVkQ29tbWVudHMi0AIKEUdlbmVyYXRlZENvZGVJbmZvEk0KCmFubm90YXRpb24YASADKAsyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvblIKYW5ub3RhdGlvbhrrAQoKQW5ub3RhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIfCgtzb3VyY2VfZmlsZRgCIAEoCVIKc291cmNlRmlsZRIUCgViZWdpbhgDIAEoBVIFYmVnaW4SEAoDZW5kGAQgASgFUgNlbmQSUgoIc2VtYW50aWMYBSABKA4yNi5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5TZW1hbnRpY1IIc2VtYW50aWMiKAoIU2VtYW50aWMSCAoETk9ORRAAEgcKA1NFVBABEgkKBUFMSUFTEAJCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIQRGVzY3JpcHRvclByb3Rvc0gBWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGL4AQGiAgNHUEKqAhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgqoAgocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxIKZ29vZ2xlLmFwaRoVZ29vZ2xlL2FwaS9odHRwLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzpLCgRodHRwEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYsMq8IiABKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgRodHRwQm4KDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCsY9Ch5wcm90by9leHBlcmltZW50L3NlcnZpY2UucHJvdG8SFGJ1Y2tldGVlci5leHBlcmltZW50Ghxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aHnByb3RvL2V4cGVyaW1lbnQvY29tbWFuZC5wcm90bxobcHJvdG8vZXhwZXJpbWVudC9nb2FsLnByb3RvGiFwcm90by9leHBlcmltZW50L2V4cGVyaW1lbnQucHJvdG8iVwoOR2V0R29hbFJlcXVlc3QSEwoCaWQYASABKAlCA+BBAlICaWQSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZEoECAIQAyJBCg9HZXRHb2FsUmVzcG9uc2USLgoEZ29hbBgBIAEoCzIaLmJ1Y2tldGVlci5leHBlcmltZW50LkdvYWxSBGdvYWwirwQKEExpc3RHb2Fsc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJJCghvcmRlcl9ieRgEIAEoDjIuLmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RHb2Fsc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJeCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNS5idWNrZXRlZXIuZXhwZXJpbWVudC5MaXN0R29hbHNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBJDChBpc19pbl91c2Vfc3RhdHVzGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaXNJblVzZVN0YXR1cxI2CghhcmNoaXZlZBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEioKDmVudmlyb25tZW50X2lkGAkgASgJQgPgQQJSDWVudmlyb25tZW50SWQiQAoHT3JkZXJCeRILCgdERUZBVUxUEAASCAoETkFNRRABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIAxAEIn4KEUxpc3RHb2Fsc1Jlc3BvbnNlEjAKBWdvYWxzGAEgAygLMhouYnVja2V0ZWVyLmV4cGVyaW1lbnQuR29hbFIFZ29hbHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi6wEKEUNyZWF0ZUdvYWxSZXF1ZXN0ElQKB2NvbW1hbmQYASABKAsyJy5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVHb2FsQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSB2NvbW1hbmQSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZBITCgJpZBgEIAEoCUID4EECUgJpZBIXCgRuYW1lGAUgASgJQgPgQQJSBG5hbWUSIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uSgQIAhADIkQKEkNyZWF0ZUdvYWxSZXNwb25zZRIuCgRnb2FsGAEgASgLMhouYnVja2V0ZWVyLmV4cGVyaW1lbnQuR29hbFIEZ29hbCKVAQoSQXJjaGl2ZUdvYWxSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJCCgdjb21tYW5kGAIgASgLMiguYnVja2V0ZWVyLmV4cGVyaW1lbnQuQXJjaGl2ZUdvYWxDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhUKE0FyY2hpdmVHb2FsUmVzcG9uc2UikwEKEURlbGV0ZUdvYWxSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJBCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRGVsZXRlR29hbENvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFAoSRGVsZXRlR29hbFJlc3BvbnNlIpICChFVcGRhdGVHb2FsUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSTgoOcmVuYW1lX2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuZXhwZXJpbWVudC5SZW5hbWVHb2FsQ29tbWFuZFINcmVuYW1lQ29tbWFuZBJwChpjaGFuZ2VfZGVzY3JpcHRpb25fY29tbWFuZBgDIAEoCzIyLmJ1Y2tldGVlci5leHBlcmltZW50LkNoYW5nZURlc2NyaXB0aW9uR29hbENvbW1hbmRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAQQBSIUChJVcGRhdGVHb2FsUmVzcG9uc2UiUwoUR2V0RXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIlkKFUdldEV4cGVyaW1lbnRSZXNwb25zZRJACgpleHBlcmltZW50GAEgASgLMiAuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudFIKZXhwZXJpbWVudCKaBgoWTGlzdEV4cGVyaW1lbnRzUmVxdWVzdBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSRAoPZmVhdHVyZV92ZXJzaW9uGAIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSDmZlYXR1cmVWZXJzaW9uEhIKBGZyb20YAyABKANSBGZyb20SDgoCdG8YBCABKANSAnRvEhsKCXBhZ2Vfc2l6ZRgFIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAYgASgJUgZjdXJzb3ISMwoGc3RhdHVzGAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSBnN0YXR1cxIeCgptYWludGFpbmVyGAkgASgJUgptYWludGFpbmVyEk8KCG9yZGVyX2J5GAogASgOMjQuYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEV4cGVyaW1lbnRzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmQKD29yZGVyX2RpcmVjdGlvbhgLIAEoDjI7LmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RFeHBlcmltZW50c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAwgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGFyY2hpdmVkGA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSQwoIc3RhdHVzZXMYDiADKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IIc3RhdHVzZXMSJQoOZW52aXJvbm1lbnRfaWQYDyABKAlSDWVudmlyb25tZW50SWQiQAoHT3JkZXJCeRILCgdERUZBVUxUEAASCAoETkFNRRABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIBxAIIpYBChdMaXN0RXhwZXJpbWVudHNSZXNwb25zZRJCCgtleHBlcmltZW50cxgBIAMoCzIgLmJ1Y2tldGVlci5leHBlcmltZW50LkV4cGVyaW1lbnRSC2V4cGVyaW1lbnRzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50Io8BChdDcmVhdGVFeHBlcmltZW50UmVxdWVzdBJHCgdjb21tYW5kGAEgASgLMi0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ3JlYXRlRXhwZXJpbWVudENvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiXAoYQ3JlYXRlRXhwZXJpbWVudFJlc3BvbnNlEkAKCmV4cGVyaW1lbnQYASABKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgpleHBlcmltZW50IrsDChdVcGRhdGVFeHBlcmltZW50UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSfAogY2hhbmdlX2V4cGVyaW1lbnRfcGVyaW9kX2NvbW1hbmQYBSABKAsyMy5idWNrZXRlZXIuZXhwZXJpbWVudC5DaGFuZ2VFeHBlcmltZW50UGVyaW9kQ29tbWFuZFIdY2hhbmdlRXhwZXJpbWVudFBlcmlvZENvbW1hbmQSYQoTY2hhbmdlX25hbWVfY29tbWFuZBgGIAEoCzIxLmJ1Y2tldGVlci5leHBlcmltZW50LkNoYW5nZUV4cGVyaW1lbnROYW1lQ29tbWFuZFIRY2hhbmdlTmFtZUNvbW1hbmQSdgoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYByABKAsyOC5idWNrZXRlZXIuZXhwZXJpbWVudC5DaGFuZ2VFeHBlcmltZW50RGVzY3JpcHRpb25Db21tYW5kUhhjaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWRKBAgCEANKBAgDEARKBAgEEAUiGgoYVXBkYXRlRXhwZXJpbWVudFJlc3BvbnNlIp0BChZTdGFydEV4cGVyaW1lbnRSZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBJGCgdjb21tYW5kGAMgASgLMiwuYnVja2V0ZWVyLmV4cGVyaW1lbnQuU3RhcnRFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIZChdTdGFydEV4cGVyaW1lbnRSZXNwb25zZSKfAQoXRmluaXNoRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEkcKB2NvbW1hbmQYAyABKAsyLS5idWNrZXRlZXIuZXhwZXJpbWVudC5GaW5pc2hFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIaChhGaW5pc2hFeHBlcmltZW50UmVzcG9uc2UimwEKFVN0b3BFeHBlcmltZW50UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRQoHY29tbWFuZBgCIAEoCzIrLmJ1Y2tldGVlci5leHBlcmltZW50LlN0b3BFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZTdG9wRXhwZXJpbWVudFJlc3BvbnNlIqEBChhBcmNoaXZlRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkgKB2NvbW1hbmQYAiABKAsyLi5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlRXhwZXJpbWVudENvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGwoZQXJjaGl2ZUV4cGVyaW1lbnRSZXNwb25zZSKfAQoXRGVsZXRlRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkcKB2NvbW1hbmQYAiABKAsyLS5idWNrZXRlZXIuZXhwZXJpbWVudC5EZWxldGVFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIaChhEZWxldGVFeHBlcmltZW50UmVzcG9uc2Uy+BYKEUV4cGVyaW1lbnRTZXJ2aWNlEoIECgdHZXRHb2FsEiQuYnVja2V0ZWVyLmV4cGVyaW1lbnQuR2V0R29hbFJlcXVlc3QaJS5idWNrZXRlZXIuZXhwZXJpbWVudC5HZXRHb2FsUmVzcG9uc2UiqQOSQZUDCgRnb2FsEgNHZXQaC0dldCBhIGdvYWwuKg93ZWIudjEuZ29hbC5nZXRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIKEggvdjEvZ29hbBKMBAoJTGlzdEdvYWxzEiYuYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEdvYWxzUmVxdWVzdBonLmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RHb2Fsc1Jlc3BvbnNlIq0DkkGYAwoEZ29hbBIETGlzdBoLTGlzdCBnb2Fscy4qEXdlYi52MS5nb2Fscy5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCCxIJL3YxL2dvYWxzEpcECgpDcmVhdGVHb2FsEicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ3JlYXRlR29hbFJlcXVlc3QaKC5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVHb2FsUmVzcG9uc2UitQOSQZ4DCgRnb2FsEgZDcmVhdGUaDkNyZWF0ZSBhIGdvYWwuKhJ3ZWIudjEuZ29hbC5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwINIggvdjEvZ29hbDoBKhJhCgpVcGRhdGVHb2FsEicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuVXBkYXRlR29hbFJlcXVlc3QaKC5idWNrZXRlZXIuZXhwZXJpbWVudC5VcGRhdGVHb2FsUmVzcG9uc2UiABJkCgtBcmNoaXZlR29hbBIoLmJ1Y2tldGVlci5leHBlcmltZW50LkFyY2hpdmVHb2FsUmVxdWVzdBopLmJ1Y2tldGVlci5leHBlcmltZW50LkFyY2hpdmVHb2FsUmVzcG9uc2UiABJhCgpEZWxldGVHb2FsEicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRGVsZXRlR29hbFJlcXVlc3QaKC5idWNrZXRlZXIuZXhwZXJpbWVudC5EZWxldGVHb2FsUmVzcG9uc2UiABJqCg1HZXRFeHBlcmltZW50EiouYnVja2V0ZWVyLmV4cGVyaW1lbnQuR2V0RXhwZXJpbWVudFJlcXVlc3QaKy5idWNrZXRlZXIuZXhwZXJpbWVudC5HZXRFeHBlcmltZW50UmVzcG9uc2UiABJwCg9MaXN0RXhwZXJpbWVudHMSLC5idWNrZXRlZXIuZXhwZXJpbWVudC5MaXN0RXhwZXJpbWVudHNSZXF1ZXN0Gi0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEV4cGVyaW1lbnRzUmVzcG9uc2UiABJzChBDcmVhdGVFeHBlcmltZW50Ei0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ3JlYXRlRXhwZXJpbWVudFJlcXVlc3QaLi5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVFeHBlcmltZW50UmVzcG9uc2UiABJzChBVcGRhdGVFeHBlcmltZW50Ei0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuVXBkYXRlRXhwZXJpbWVudFJlcXVlc3QaLi5idWNrZXRlZXIuZXhwZXJpbWVudC5VcGRhdGVFeHBlcmltZW50UmVzcG9uc2UiABJwCg9TdGFydEV4cGVyaW1lbnQSLC5idWNrZXRlZXIuZXhwZXJpbWVudC5TdGFydEV4cGVyaW1lbnRSZXF1ZXN0Gi0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuU3RhcnRFeHBlcmltZW50UmVzcG9uc2UiABJzChBGaW5pc2hFeHBlcmltZW50Ei0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuRmluaXNoRXhwZXJpbWVudFJlcXVlc3QaLi5idWNrZXRlZXIuZXhwZXJpbWVudC5GaW5pc2hFeHBlcmltZW50UmVzcG9uc2UiABJtCg5TdG9wRXhwZXJpbWVudBIrLmJ1Y2tldGVlci5leHBlcmltZW50LlN0b3BFeHBlcmltZW50UmVxdWVzdBosLmJ1Y2tldGVlci5leHBlcmltZW50LlN0b3BFeHBlcmltZW50UmVzcG9uc2UiABJ2ChFBcmNoaXZlRXhwZXJpbWVudBIuLmJ1Y2tldGVlci5leHBlcmltZW50LkFyY2hpdmVFeHBlcmltZW50UmVxdWVzdBovLmJ1Y2tldGVlci5leHBlcmltZW50LkFyY2hpdmVFeHBlcmltZW50UmVzcG9uc2UiABJzChBEZWxldGVFeHBlcmltZW50Ei0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuRGVsZXRlRXhwZXJpbWVudFJlcXVlc3QaLi5idWNrZXRlZXIuZXhwZXJpbWVudC5EZWxldGVFeHBlcmltZW50UmVzcG9uc2UiAEI0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8z
+ experimentDescriptor: CtYBCh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiZwoJVmFyaWF0aW9uEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUSEgoEbmFtZRgDIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq3CAohcHJvdG8vZXhwZXJpbWVudC9leHBlcmltZW50LnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudBodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8iywYKCkV4cGVyaW1lbnQSDgoCaWQYASABKAlSAmlkEhsKB2dvYWxfaWQYAiABKAlCAhgBUgZnb2FsSWQSHQoKZmVhdHVyZV9pZBgDIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgEIAEoBVIOZmVhdHVyZVZlcnNpb24SPAoKdmFyaWF0aW9ucxgFIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSHAoHc3RvcHBlZBgIIAEoCEICGAFSB3N0b3BwZWQSIQoKc3RvcHBlZF9hdBgJIAEoA0ICMAFSCXN0b3BwZWRBdBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYDCABKAhSB2RlbGV0ZWQSGQoIZ29hbF9pZHMYDSADKAlSB2dvYWxJZHMSEgoEbmFtZRgOIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgPIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYECABKAlSD2Jhc2VWYXJpYXRpb25JZBI/CgZzdGF0dXMYEiABKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IGc3RhdHVzEh4KCm1haW50YWluZXIYEyABKAlSCm1haW50YWluZXISGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkEkQKBWdvYWxzGBUgAygLMi4uYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudC5Hb2FsUmVmZXJlbmNlUgVnb2FscxozCg1Hb2FsUmVmZXJlbmNlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIkIKBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgsKB1NUT1BQRUQQAhIRCg1GT1JDRV9TVE9QUEVEEANKBAgREBIiUQoLRXhwZXJpbWVudHMSQgoLZXhwZXJpbWVudHMYASADKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgtleHBlcmltZW50c0I0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8zCuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCpoLChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8ihgEKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEj4KC2FjdGlvbl90eXBlGAMgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSLfAgoST3BzRXZlbnRSYXRlQ2xhdXNlEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQSFwoHZ29hbF9pZBgDIAEoCVIGZ29hbElkEhsKCW1pbl9jb3VudBgEIAEoA1IIbWluQ291bnQSKQoQdGhyZWFkc2hvbGRfcmF0ZRgFIAEoAVIPdGhyZWFkc2hvbGRSYXRlEkoKCG9wZXJhdG9yGAYgASgOMi4uYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchI+CgthY3Rpb25fdHlwZRgHIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiJkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lEj4KC2FjdGlvbl90eXBlGAIgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADKjIKCkFjdGlvblR5cGUSCwoHVU5LTk9XThAAEgoKBkVOQUJMRRABEgsKB0RJU0FCTEUQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCr0FCiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90byLQAgoLQXV0b09wc1J1bGUSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgDIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgEIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQSSAoPYXV0b19vcHNfc3RhdHVzGAogASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1INYXV0b09wc1N0YXR1c0oECAYQByJUCgxBdXRvT3BzUnVsZXMSRAoOYXV0b19vcHNfcnVsZXMYASADKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVIMYXV0b09wc1J1bGVzKj8KB09wc1R5cGUSEAoMVFlQRV9VTktOT1dOEAASDAoIU0NIRURVTEUQAhIOCgpFVkVOVF9SQVRFEAMiBAgBEAEqRAoNQXV0b09wc1N0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMKvwUKG3Byb3RvL2V4cGVyaW1lbnQvZ29hbC5wcm90bxIUYnVja2V0ZWVyLmV4cGVyaW1lbnQaIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90bxohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvIoUECgRHb2FsEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWxldGVkGAQgASgIUgdkZWxldGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSJwoQaXNfaW5fdXNlX3N0YXR1cxgHIAEoCFINaXNJblVzZVN0YXR1cxIaCghhcmNoaXZlZBgIIAEoCFIIYXJjaGl2ZWQSUgoPY29ubmVjdGlvbl90eXBlGAkgASgOMikuYnVja2V0ZWVyLmV4cGVyaW1lbnQuR29hbC5Db25uZWN0aW9uVHlwZVIOY29ubmVjdGlvblR5cGUSQgoLZXhwZXJpbWVudHMYCiADKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgtleHBlcmltZW50cxJECg5hdXRvX29wc19ydWxlcxgLIAMoCzIeLmJ1Y2tldGVlci5hdXRvb3BzLkF1dG9PcHNSdWxlUgxhdXRvT3BzUnVsZXMiPAoOQ29ubmVjdGlvblR5cGUSCwoHVU5LTk9XThAAEg4KCkVYUEVSSU1FTlQQARINCglPUEVSQVRJT04QAkI0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8zCp4ICh5wcm90by9leHBlcmltZW50L2NvbW1hbmQucHJvdG8SFGJ1Y2tldGVlci5leHBlcmltZW50Ghtwcm90by9leHBlcmltZW50L2dvYWwucHJvdG8irQEKEUNyZWF0ZUdvYWxDb21tYW5kEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhJSCg9jb25uZWN0aW9uX3R5cGUYBCABKA4yKS5idWNrZXRlZXIuZXhwZXJpbWVudC5Hb2FsLkNvbm5lY3Rpb25UeXBlUg5jb25uZWN0aW9uVHlwZSInChFSZW5hbWVHb2FsQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIkAKHENoYW5nZURlc2NyaXB0aW9uR29hbENvbW1hbmQSIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uIhQKEkFyY2hpdmVHb2FsQ29tbWFuZCITChFEZWxldGVHb2FsQ29tbWFuZCLvAQoXQ3JlYXRlRXhwZXJpbWVudENvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhkKCHN0YXJ0X2F0GAMgASgDUgdzdGFydEF0EhcKB3N0b3BfYXQYBCABKANSBnN0b3BBdBIZCghnb2FsX2lkcxgFIAMoCVIHZ29hbElkcxISCgRuYW1lGAYgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAcgASgJUgtkZXNjcmlwdGlvbhIqChFiYXNlX3ZhcmlhdGlvbl9pZBgIIAEoCVIPYmFzZVZhcmlhdGlvbklkSgQIAhADIlMKHUNoYW5nZUV4cGVyaW1lbnRQZXJpb2RDb21tYW5kEhkKCHN0YXJ0X2F0GAEgASgDUgdzdGFydEF0EhcKB3N0b3BfYXQYAiABKANSBnN0b3BBdCIxChtDaGFuZ2VFeHBlcmltZW50TmFtZUNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZSJGCiJDaGFuZ2VFeHBlcmltZW50RGVzY3JpcHRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIXChVTdG9wRXhwZXJpbWVudENvbW1hbmQiGgoYQXJjaGl2ZUV4cGVyaW1lbnRDb21tYW5kIhkKF0RlbGV0ZUV4cGVyaW1lbnRDb21tYW5kIhgKFlN0YXJ0RXhwZXJpbWVudENvbW1hbmQiGQoXRmluaXNoRXhwZXJpbWVudENvbW1hbmRCNFoyZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V4cGVyaW1lbnRiBnByb3RvMwqHBQoVZ29vZ2xlL2FwaS9odHRwLnByb3RvEgpnb29nbGUuYXBpInkKBEh0dHASKgoFcnVsZXMYASADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgVydWxlcxJFCh9mdWxseV9kZWNvZGVfcmVzZXJ2ZWRfZXhwYW5zaW9uGAIgASgIUhxmdWxseURlY29kZVJlc2VydmVkRXhwYW5zaW9uIrUCCghIdHRwUnVsZRIaCghzZWxlY3RvchgBIAEoCVIIc2VsZWN0b3ISEgoDZ2V0GAIgASgJSABSA2dldBISCgNwdXQYAyABKAlIAFIDcHV0EhQKBHBvc3QYBCABKAlIAFIEcG9zdBIYCgZkZWxldGUYBSABKAlIAFIGZGVsZXRlEhYKBXBhdGNoGAYgASgJSABSBXBhdGNoEjcKBmN1c3RvbRgIIAEoCzIdLmdvb2dsZS5hcGkuQ3VzdG9tSHR0cFBhdHRlcm5IAFIGY3VzdG9tEhIKBGJvZHkYByABKAlSBGJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8zCuFGCiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIk0KEUZpbGVEZXNjcmlwdG9yU2V0EjgKBGZpbGUYASADKAsyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1IEZmlsZSL+BAoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIYCgdlZGl0aW9uGA0gASgJUgdlZGl0aW9uIrkGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUaegoORXh0ZW5zaW9uUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kEkAKB29wdGlvbnMYAyABKAsyJi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zUgdvcHRpb25zGjcKDVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIq0EChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24SWQoLZGVjbGFyYXRpb24YAiADKAsyMi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uQgOIAQJSC2RlY2xhcmF0aW9uEmgKDHZlcmlmaWNhdGlvbhgDIAEoDjI4Lmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGU6ClVOVkVSSUZJRURSDHZlcmlmaWNhdGlvbhqzAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEiMKC2lzX3JlcGVhdGVkGAQgASgIQgIYAVIKaXNSZXBlYXRlZBIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFURUQQAyJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIpEJCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxI3ChRwaHBfZ2VuZXJpY19zZXJ2aWNlcxgqIAEoCDoFZmFsc2VSEnBocEdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECciuwMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKFCQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJKCgZ0YXJnZXQYEiABKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVCAhgBUgZ0YXJnZXQSSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFInMKDE9uZW9mT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpgCCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLQAgoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGusBCgpBbm5vdGF0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEh8KC3NvdXJjZV9maWxlGAIgASgJUgpzb3VyY2VGaWxlEhQKBWJlZ2luGAMgASgFUgViZWdpbhIQCgNlbmQYBCABKAVSA2VuZBJSCghzZW1hbnRpYxgFIAEoDjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLlNlbWFudGljUghzZW1hbnRpYyIoCghTZW1hbnRpYxIICgROT05FEAASBwoDU0VUEAESCQoFQUxJQVMQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCqgCChxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpGhVnb29nbGUvYXBpL2h0dHAucHJvdG8aIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK6AMKH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8SCmdvb2dsZS5hcGkaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvKrYBCg1GaWVsZEJlaGF2aW9yEh4KGkZJRUxEX0JFSEFWSU9SX1VOU1BFQ0lGSUVEEAASDAoIT1BUSU9OQUwQARIMCghSRVFVSVJFRBACEg8KC09VVFBVVF9PTkxZEAMSDgoKSU5QVVRfT05MWRAEEg0KCUlNTVVUQUJMRRAFEhIKDlVOT1JERVJFRF9MSVNUEAYSFQoRTk9OX0VNUFRZX0RFRkFVTFQQBxIOCgpJREVOVElGSUVSEAg6ZAoOZmllbGRfYmVoYXZpb3ISHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJwIIAMoDjIZLmdvb2dsZS5hcGkuRmllbGRCZWhhdmlvckICEABSDWZpZWxkQmVoYXZpb3JCcAoOY29tLmdvb2dsZS5hcGlCEkZpZWxkQmVoYXZpb3JQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwriBQocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIpgBCgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEisgIKBVZhbHVlEjsKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSABSCW51bGxWYWx1ZRIjCgxudW1iZXJfdmFsdWUYAiABKAFIAFILbnVtYmVyVmFsdWUSIwoMc3RyaW5nX3ZhbHVlGAMgASgJSABSC3N0cmluZ1ZhbHVlEh8KCmJvb2xfdmFsdWUYBCABKAhIAFIJYm9vbFZhbHVlEjwKDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAFILc3RydWN0VmFsdWUSOwoKbGlzdF92YWx1ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIAFIJbGlzdFZhbHVlQgYKBGtpbmQiOwoJTGlzdFZhbHVlEi4KBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIGdmFsdWVzKhsKCU51bGxWYWx1ZRIOCgpOVUxMX1ZBTFVFEABCfwoTY29tLmdvb2dsZS5wcm90b2J1ZkILU3RydWN0UHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqmPgoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIrMICgdTd2FnZ2VyEhgKB3N3YWdnZXIYASABKAlSB3N3YWdnZXISQwoEaW5mbxgCIAEoCzIvLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm9SBGluZm8SEgoEaG9zdBgDIAEoCVIEaG9zdBIbCgliYXNlX3BhdGgYBCABKAlSCGJhc2VQYXRoEksKB3NjaGVtZXMYBSADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJfCglyZXNwb25zZXMYCiADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMScQoUc2VjdXJpdHlfZGVmaW5pdGlvbnMYCyABKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zUhNzZWN1cml0eURlZmluaXRpb25zEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSQgoEdGFncxgNIAMoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IEdGFncxJlCg1leHRlcm5hbF9kb2NzGA4gASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSYgoKZXh0ZW5zaW9ucxgPIAMoCzJCLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCUoECAkQCiLWBwoJT3BlcmF0aW9uEhIKBHRhZ3MYASADKAlSBHRhZ3MSGAoHc3VtbWFyeRgCIAEoCVIHc3VtbWFyeRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgEIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEiEKDG9wZXJhdGlvbl9pZBgFIAEoCVILb3BlcmF0aW9uSWQSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJhCglyZXNwb25zZXMYCSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJLCgdzY2hlbWVzGAogAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEh4KCmRlcHJlY2F0ZWQYCyABKAhSCmRlcHJlY2F0ZWQSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJkCgpleHRlbnNpb25zGA0gAygLMkQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxJVCgpwYXJhbWV0ZXJzGA4gASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUGFyYW1ldGVyc1IKcGFyYW1ldGVycxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAkiYgoKUGFyYW1ldGVycxJUCgdoZWFkZXJzGAEgAygLMjouZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyUgdoZWFkZXJzIqMCCg9IZWFkZXJQYXJhbWV0ZXISEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SUwoEdHlwZRgDIAEoDjI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlci5UeXBlUgR0eXBlEhYKBmZvcm1hdBgEIAEoCVIGZm9ybWF0EhoKCHJlcXVpcmVkGAUgASgIUghyZXF1aXJlZCJFCgRUeXBlEgsKB1VOS05PV04QABIKCgZTVFJJTkcQARIKCgZOVU1CRVIQAhILCgdJTlRFR0VSEAMSCwoHQk9PTEVBThAESgQIBhAHSgQIBxAIItgBCgZIZWFkZXISIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhIKBHR5cGUYAiABKAlSBHR5cGUSFgoGZm9ybWF0GAMgASgJUgZmb3JtYXQSGAoHZGVmYXVsdBgGIAEoCVIHZGVmYXVsdBIYCgdwYXR0ZXJuGA0gASgJUgdwYXR0ZXJuSgQIBBAFSgQIBRAGSgQIBxAISgQICBAJSgQICRAKSgQIChALSgQICxAMSgQIDBANSgQIDhAPSgQIDxAQSgQIEBARSgQIERASSgQIEhATIpoFCghSZXNwb25zZRIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SSQoGc2NoZW1hGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUgZzY2hlbWESWgoHaGVhZGVycxgDIAMoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxJdCghleGFtcGxlcxgEIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4YW1wbGVzRW50cnlSCGV4YW1wbGVzEmMKCmV4dGVuc2lvbnMYBSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMabQoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkcKBXZhbHVlGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUgV2YWx1ZToCOAEaOwoNRXhhbXBsZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBItYDCgRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SKAoQdGVybXNfb2Zfc2VydmljZRgDIAEoCVIOdGVybXNPZlNlcnZpY2USTAoHY29udGFjdBgEIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkNvbnRhY3RSB2NvbnRhY3QSTAoHbGljZW5zZRgFIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkxpY2Vuc2VSB2xpY2Vuc2USGAoHdmVyc2lvbhgGIAEoCVIHdmVyc2lvbhJfCgpleHRlbnNpb25zGAcgAygLMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mby5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiRQoHQ29udGFjdBISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsEhQKBWVtYWlsGAMgASgJUgVlbWFpbCIvCgdMaWNlbnNlEhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwiSwoVRXh0ZXJuYWxEb2N1bWVudGF0aW9uEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhIQCgN1cmwYAiABKAlSA3VybCKqAgoGU2NoZW1hElYKC2pzb25fc2NoZW1hGAEgASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIKanNvblNjaGVtYRIkCg1kaXNjcmltaW5hdG9yGAIgASgJUg1kaXNjcmltaW5hdG9yEhsKCXJlYWRfb25seRgDIAEoCFIIcmVhZE9ubHkSZQoNZXh0ZXJuYWxfZG9jcxgFIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEhgKB2V4YW1wbGUYBiABKAlSB2V4YW1wbGVKBAgEEAUi1woKCkpTT05TY2hlbWESEAoDcmVmGAMgASgJUgNyZWYSFAoFdGl0bGUYBSABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAYgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWZhdWx0GAcgASgJUgdkZWZhdWx0EhsKCXJlYWRfb25seRgIIAEoCFIIcmVhZE9ubHkSGAoHZXhhbXBsZRgJIAEoCVIHZXhhbXBsZRIfCgttdWx0aXBsZV9vZhgKIAEoAVIKbXVsdGlwbGVPZhIYCgdtYXhpbXVtGAsgASgBUgdtYXhpbXVtEisKEWV4Y2x1c2l2ZV9tYXhpbXVtGAwgASgIUhBleGNsdXNpdmVNYXhpbXVtEhgKB21pbmltdW0YDSABKAFSB21pbmltdW0SKwoRZXhjbHVzaXZlX21pbmltdW0YDiABKAhSEGV4Y2x1c2l2ZU1pbmltdW0SHQoKbWF4X2xlbmd0aBgPIAEoBFIJbWF4TGVuZ3RoEh0KCm1pbl9sZW5ndGgYECABKARSCW1pbkxlbmd0aBIYCgdwYXR0ZXJuGBEgASgJUgdwYXR0ZXJuEhsKCW1heF9pdGVtcxgUIAEoBFIIbWF4SXRlbXMSGwoJbWluX2l0ZW1zGBUgASgEUghtaW5JdGVtcxIhCgx1bmlxdWVfaXRlbXMYFiABKAhSC3VuaXF1ZUl0ZW1zEiUKDm1heF9wcm9wZXJ0aWVzGBggASgEUg1tYXhQcm9wZXJ0aWVzEiUKDm1pbl9wcm9wZXJ0aWVzGBkgASgEUg1taW5Qcm9wZXJ0aWVzEhoKCHJlcXVpcmVkGBogAygJUghyZXF1aXJlZBIUCgVhcnJheRgiIAMoCVIFYXJyYXkSXwoEdHlwZRgjIAMoDjJLLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuSlNPTlNjaGVtYVNpbXBsZVR5cGVzUgR0eXBlEhYKBmZvcm1hdBgkIAEoCVIGZm9ybWF0EhIKBGVudW0YLiADKAlSBGVudW0SegoTZmllbGRfY29uZmlndXJhdGlvbhjpByABKAsySC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkZpZWxkQ29uZmlndXJhdGlvblISZmllbGRDb25maWd1cmF0aW9uEmUKCmV4dGVuc2lvbnMYMCADKAsyRS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxo8ChJGaWVsZENvbmZpZ3VyYXRpb24SJgoPcGF0aF9wYXJhbV9uYW1lGC8gASgJUg1wYXRoUGFyYW1OYW1lGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIncKFUpTT05TY2hlbWFTaW1wbGVUeXBlcxILCgdVTktOT1dOEAASCQoFQVJSQVkQARILCgdCT09MRUFOEAISCwoHSU5URUdFUhADEggKBE5VTEwQBBIKCgZOVU1CRVIQBRIKCgZPQkpFQ1QQBhIKCgZTVFJJTkcQB0oECAEQAkoECAIQA0oECAQQBUoECBIQE0oECBMQFEoECBcQGEoECBsQHEoECBwQHUoECB0QHkoECB4QIkoECCUQKkoECCoQK0oECCsQLiLZAgoDVGFnEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYAyABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJeCgpleHRlbnNpb25zGAQgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASL3AQoTU2VjdXJpdHlEZWZpbml0aW9ucxJoCghzZWN1cml0eRgBIAMoCzJMLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnMuU2VjdXJpdHlFbnRyeVIIc2VjdXJpdHkadgoNU2VjdXJpdHlFbnRyeRIQCgNrZXkYASABKAlSA2tleRJPCgV2YWx1ZRgCIAEoCzI5LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lUgV2YWx1ZToCOAEi/wYKDlNlY3VyaXR5U2NoZW1lElIKBHR5cGUYASABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5UeXBlUgR0eXBlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhISCgRuYW1lGAMgASgJUgRuYW1lEkwKAmluGAQgASgOMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuSW5SAmluElIKBGZsb3cYBSABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5GbG93UgRmbG93EisKEWF1dGhvcml6YXRpb25fdXJsGAYgASgJUhBhdXRob3JpemF0aW9uVXJsEhsKCXRva2VuX3VybBgHIAEoCVIIdG9rZW5VcmwSSQoGc2NvcGVzGAggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzUgZzY29wZXMSaQoKZXh0ZW5zaW9ucxgJIAMoCzJJLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJLCgRUeXBlEhAKDFRZUEVfSU5WQUxJRBAAEg4KClRZUEVfQkFTSUMQARIQCgxUWVBFX0FQSV9LRVkQAhIPCgtUWVBFX09BVVRIMhADIjEKAkluEg4KCklOX0lOVkFMSUQQABIMCghJTl9RVUVSWRABEg0KCUlOX0hFQURFUhACImoKBEZsb3cSEAoMRkxPV19JTlZBTElEEAASEQoNRkxPV19JTVBMSUNJVBABEhEKDUZMT1dfUEFTU1dPUkQQAhIUChBGTE9XX0FQUExJQ0FUSU9OEAMSFAoQRkxPV19BQ0NFU1NfQ09ERRAEIvYCChNTZWN1cml0eVJlcXVpcmVtZW50EooBChRzZWN1cml0eV9yZXF1aXJlbWVudBgBIAMoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5UhNzZWN1cml0eVJlcXVpcmVtZW50GjAKGFNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZRIUCgVzY29wZRgBIAMoCVIFc2NvcGUanwEKGFNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRJtCgV2YWx1ZRgCIAEoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlUgV2YWx1ZToCOAEilgEKBlNjb3BlcxJSCgVzY29wZRgBIAMoCzI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blcy5TY29wZUVudHJ5UgVzY29wZRo4CgpTY29wZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEqOwoGU2NoZW1lEgsKB1VOS05PV04QABIICgRIVFRQEAESCQoFSFRUUFMQAhIGCgJXUxADEgcKA1dTUxAEQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr9BgoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvGixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bzp+ChFvcGVuYXBpdjJfc3dhZ2dlchIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiSCCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyUhBvcGVuYXBpdjJTd2FnZ2VyOoYBChNvcGVuYXBpdjJfb3BlcmF0aW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYkgggASgLMjQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uUhJvcGVuYXBpdjJPcGVyYXRpb246fgoQb3BlbmFwaXYyX3NjaGVtYRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiSCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSD29wZW5hcGl2MlNjaGVtYTp1Cg1vcGVuYXBpdjJfdGFnEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJIIIAEoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IMb3BlbmFwaXYyVGFnOn4KD29wZW5hcGl2Ml9maWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkgggASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIOb3BlbmFwaXYyRmllbGRCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKvVYKHnByb3RvL2V4cGVyaW1lbnQvc2VydmljZS5wcm90bxIUYnVja2V0ZWVyLmV4cGVyaW1lbnQaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoecHJvdG8vZXhwZXJpbWVudC9jb21tYW5kLnByb3RvGhtwcm90by9leHBlcmltZW50L2dvYWwucHJvdG8aIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90byJXCg5HZXRHb2FsUmVxdWVzdBITCgJpZBgBIAEoCUID4EECUgJpZBIqCg5lbnZpcm9ubWVudF9pZBgDIAEoCUID4EECUg1lbnZpcm9ubWVudElkSgQIAhADIkEKD0dldEdvYWxSZXNwb25zZRIuCgRnb2FsGAEgASgLMhouYnVja2V0ZWVyLmV4cGVyaW1lbnQuR29hbFIEZ29hbCLEBAoQTGlzdEdvYWxzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEkkKCG9yZGVyX2J5GAQgASgOMi4uYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEdvYWxzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5El4KD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI1LmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RHb2Fsc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEkMKEGlzX2luX3VzZV9zdGF0dXMYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUg1pc0luVXNlU3RhdHVzEjYKCGFyY2hpdmVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSKgoOZW52aXJvbm1lbnRfaWQYCSABKAlCA+BBAlINZW52aXJvbm1lbnRJZCJVCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxITCg9DT05ORUNUSU9OX1RZUEUQBCIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgDEAQifgoRTGlzdEdvYWxzUmVzcG9uc2USMAoFZ29hbHMYASADKAsyGi5idWNrZXRlZXIuZXhwZXJpbWVudC5Hb2FsUgVnb2FscxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCK/AgoRQ3JlYXRlR29hbFJlcXVlc3QSVAoHY29tbWFuZBgBIAEoCzInLmJ1Y2tldGVlci5leHBlcmltZW50LkNyZWF0ZUdvYWxDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIqCg5lbnZpcm9ubWVudF9pZBgDIAEoCUID4EECUg1lbnZpcm9ubWVudElkEhMKAmlkGAQgASgJQgPgQQJSAmlkEhcKBG5hbWUYBSABKAlCA+BBAlIEbmFtZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SUgoPY29ubmVjdGlvbl90eXBlGAcgASgOMikuYnVja2V0ZWVyLmV4cGVyaW1lbnQuR29hbC5Db25uZWN0aW9uVHlwZVIOY29ubmVjdGlvblR5cGVKBAgCEAMiRAoSQ3JlYXRlR29hbFJlc3BvbnNlEi4KBGdvYWwYASABKAsyGi5idWNrZXRlZXIuZXhwZXJpbWVudC5Hb2FsUgRnb2FsIpUBChJBcmNoaXZlR29hbFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlR29hbENvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFQoTQXJjaGl2ZUdvYWxSZXNwb25zZSKwAQoRRGVsZXRlR29hbFJlcXVlc3QSEwoCaWQYASABKAlCA+BBAlICaWQSVAoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5leHBlcmltZW50LkRlbGV0ZUdvYWxDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIqCg5lbnZpcm9ubWVudF9pZBgEIAEoCUID4EECUg1lbnZpcm9ubWVudElkSgQIAxAEIhQKEkRlbGV0ZUdvYWxSZXNwb25zZSKWBAoRVXBkYXRlR29hbFJlcXVlc3QSEwoCaWQYASABKAlCA+BBAlICaWQSYQoOcmVuYW1lX2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuZXhwZXJpbWVudC5SZW5hbWVHb2FsQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSDXJlbmFtZUNvbW1hbmQSgwEKGmNoYW5nZV9kZXNjcmlwdGlvbl9jb21tYW5kGAMgASgLMjIuYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ2hhbmdlRGVzY3JpcHRpb25Hb2FsQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBIqCg5lbnZpcm9ubWVudF9pZBgFIAEoCUID4EECUg1lbnZpcm9ubWVudElkEjAKBG5hbWUYBiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSBG5hbWUSPgoLZGVzY3JpcHRpb24YByABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSC2Rlc2NyaXB0aW9uEl8KCGFyY2hpdmVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUInkkEkMiJpZiB0cnVlLCB0aGUgZ29hbCB3aWxsIGJlIGFyY2hpdmVkUghhcmNoaXZlZEoECAQQBSJEChJVcGRhdGVHb2FsUmVzcG9uc2USLgoEZ29hbBgBIAEoCzIaLmJ1Y2tldGVlci5leHBlcmltZW50LkdvYWxSBGdvYWwiUwoUR2V0RXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIlkKFUdldEV4cGVyaW1lbnRSZXNwb25zZRJACgpleHBlcmltZW50GAEgASgLMiAuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudFIKZXhwZXJpbWVudCKfBgoWTGlzdEV4cGVyaW1lbnRzUmVxdWVzdBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSRAoPZmVhdHVyZV92ZXJzaW9uGAIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSDmZlYXR1cmVWZXJzaW9uEhIKBGZyb20YAyABKANSBGZyb20SDgoCdG8YBCABKANSAnRvEhsKCXBhZ2Vfc2l6ZRgFIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAYgASgJUgZjdXJzb3ISMwoGc3RhdHVzGAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSBnN0YXR1cxIeCgptYWludGFpbmVyGAkgASgJUgptYWludGFpbmVyEk8KCG9yZGVyX2J5GAogASgOMjQuYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEV4cGVyaW1lbnRzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmQKD29yZGVyX2RpcmVjdGlvbhgLIAEoDjI7LmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RFeHBlcmltZW50c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAwgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGFyY2hpdmVkGA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSQwoIc3RhdHVzZXMYDiADKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IIc3RhdHVzZXMSKgoOZW52aXJvbm1lbnRfaWQYDyABKAlCA+BBAlINZW52aXJvbm1lbnRJZCJACgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAyIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgHEAgigwMKF0xpc3RFeHBlcmltZW50c1Jlc3BvbnNlEkIKC2V4cGVyaW1lbnRzGAEgAygLMiAuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudFILZXhwZXJpbWVudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQSTwoHc3VtbWFyeRgEIAEoCzI1LmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RFeHBlcmltZW50c1Jlc3BvbnNlLlN1bW1hcnlSB3N1bW1hcnkamQEKB1N1bW1hcnkSLgoTdG90YWxfd2FpdGluZ19jb3VudBgBIAEoA1IRdG90YWxXYWl0aW5nQ291bnQSLgoTdG90YWxfcnVubmluZ19jb3VudBgCIAEoA1IRdG90YWxSdW5uaW5nQ291bnQSLgoTdG90YWxfc3RvcHBlZF9jb3VudBgDIAEoA1IRdG90YWxTdG9wcGVkQ291bnQilQMKF0NyZWF0ZUV4cGVyaW1lbnRSZXF1ZXN0EloKB2NvbW1hbmQYASABKAsyLS5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVFeHBlcmltZW50Q29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSB2NvbW1hbmQSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZBIiCgpmZWF0dXJlX2lkGAQgASgJQgPgQQJSCWZlYXR1cmVJZBIeCghzdGFydF9hdBgFIAEoA0ID4EECUgdzdGFydEF0EhwKB3N0b3BfYXQYBiABKANCA+BBAlIGc3RvcEF0Eh4KCGdvYWxfaWRzGAcgAygJQgPgQQJSB2dvYWxJZHMSFwoEbmFtZRgIIAEoCUID4EECUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAkgASgJUgtkZXNjcmlwdGlvbhIvChFiYXNlX3ZhcmlhdGlvbl9pZBgKIAEoCUID4EECUg9iYXNlVmFyaWF0aW9uSWRKBAgCEAMiXAoYQ3JlYXRlRXhwZXJpbWVudFJlc3BvbnNlEkAKCmV4cGVyaW1lbnQYASABKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgpleHBlcmltZW50IrsDChdVcGRhdGVFeHBlcmltZW50UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSfAogY2hhbmdlX2V4cGVyaW1lbnRfcGVyaW9kX2NvbW1hbmQYBSABKAsyMy5idWNrZXRlZXIuZXhwZXJpbWVudC5DaGFuZ2VFeHBlcmltZW50UGVyaW9kQ29tbWFuZFIdY2hhbmdlRXhwZXJpbWVudFBlcmlvZENvbW1hbmQSYQoTY2hhbmdlX25hbWVfY29tbWFuZBgGIAEoCzIxLmJ1Y2tldGVlci5leHBlcmltZW50LkNoYW5nZUV4cGVyaW1lbnROYW1lQ29tbWFuZFIRY2hhbmdlTmFtZUNvbW1hbmQSdgoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYByABKAsyOC5idWNrZXRlZXIuZXhwZXJpbWVudC5DaGFuZ2VFeHBlcmltZW50RGVzY3JpcHRpb25Db21tYW5kUhhjaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWRKBAgCEANKBAgDEARKBAgEEAUiGgoYVXBkYXRlRXhwZXJpbWVudFJlc3BvbnNlIp0BChZTdGFydEV4cGVyaW1lbnRSZXF1ZXN0Eg4KAmlkGAIgASgJUgJpZBJGCgdjb21tYW5kGAMgASgLMiwuYnVja2V0ZWVyLmV4cGVyaW1lbnQuU3RhcnRFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIZChdTdGFydEV4cGVyaW1lbnRSZXNwb25zZSKfAQoXRmluaXNoRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYAiABKAlSAmlkEkcKB2NvbW1hbmQYAyABKAsyLS5idWNrZXRlZXIuZXhwZXJpbWVudC5GaW5pc2hFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAEQAiIaChhGaW5pc2hFeHBlcmltZW50UmVzcG9uc2UimwEKFVN0b3BFeHBlcmltZW50UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRQoHY29tbWFuZBgCIAEoCzIrLmJ1Y2tldGVlci5leHBlcmltZW50LlN0b3BFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZTdG9wRXhwZXJpbWVudFJlc3BvbnNlIqEBChhBcmNoaXZlRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkgKB2NvbW1hbmQYAiABKAsyLi5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlRXhwZXJpbWVudENvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGwoZQXJjaGl2ZUV4cGVyaW1lbnRSZXNwb25zZSKfAQoXRGVsZXRlRXhwZXJpbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkcKB2NvbW1hbmQYAiABKAsyLS5idWNrZXRlZXIuZXhwZXJpbWVudC5EZWxldGVFeHBlcmltZW50Q29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIaChhEZWxldGVFeHBlcmltZW50UmVzcG9uc2UyvSgKEUV4cGVyaW1lbnRTZXJ2aWNlEoIECgdHZXRHb2FsEiQuYnVja2V0ZWVyLmV4cGVyaW1lbnQuR2V0R29hbFJlcXVlc3QaJS5idWNrZXRlZXIuZXhwZXJpbWVudC5HZXRHb2FsUmVzcG9uc2UiqQOSQZUDCgRnb2FsEgNHZXQaC0dldCBhIGdvYWwuKg93ZWIudjEuZ29hbC5nZXRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIKEggvdjEvZ29hbBKMBAoJTGlzdEdvYWxzEiYuYnVja2V0ZWVyLmV4cGVyaW1lbnQuTGlzdEdvYWxzUmVxdWVzdBonLmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RHb2Fsc1Jlc3BvbnNlIq0DkkGYAwoEZ29hbBIETGlzdBoLTGlzdCBnb2Fscy4qEXdlYi52MS5nb2Fscy5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCCxIJL3YxL2dvYWxzEpcECgpDcmVhdGVHb2FsEicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ3JlYXRlR29hbFJlcXVlc3QaKC5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVHb2FsUmVzcG9uc2UitQOSQZ4DCgRnb2FsEgZDcmVhdGUaDkNyZWF0ZSBhIGdvYWwuKhJ3ZWIudjEuZ29hbC5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwINIggvdjEvZ29hbDoBKhKXBAoKVXBkYXRlR29hbBInLmJ1Y2tldGVlci5leHBlcmltZW50LlVwZGF0ZUdvYWxSZXF1ZXN0GiguYnVja2V0ZWVyLmV4cGVyaW1lbnQuVXBkYXRlR29hbFJlc3BvbnNlIrUDkkGeAwoEZ29hbBIGVXBkYXRlGg5VcGRhdGUgYSBnb2FsLioSd2ViLnYxLmdvYWwudXBkYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDTIIL3YxL2dvYWw6ASoSZAoLQXJjaGl2ZUdvYWwSKC5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlR29hbFJlcXVlc3QaKS5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlR29hbFJlc3BvbnNlIgASlAQKCkRlbGV0ZUdvYWwSJy5idWNrZXRlZXIuZXhwZXJpbWVudC5EZWxldGVHb2FsUmVxdWVzdBooLmJ1Y2tldGVlci5leHBlcmltZW50LkRlbGV0ZUdvYWxSZXNwb25zZSKyA5JBngMKBGdvYWwSBkRlbGV0ZRoORGVsZXRlIGEgZ29hbC4qEndlYi52MS5nb2FsLmRlbGV0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgoqCC92MS9nb2FsEq0ECg1HZXRFeHBlcmltZW50EiouYnVja2V0ZWVyLmV4cGVyaW1lbnQuR2V0RXhwZXJpbWVudFJlcXVlc3QaKy5idWNrZXRlZXIuZXhwZXJpbWVudC5HZXRFeHBlcmltZW50UmVzcG9uc2UiwgOSQagDCgpleHBlcmltZW50EgNHZXQaEkdldCBhbiBleHBlcmltZW50LioVd2ViLnYxLmV4cGVyaW1lbnQuZ2V0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCEBIOL3YxL2V4cGVyaW1lbnQStQQKD0xpc3RFeHBlcmltZW50cxIsLmJ1Y2tldGVlci5leHBlcmltZW50Lkxpc3RFeHBlcmltZW50c1JlcXVlc3QaLS5idWNrZXRlZXIuZXhwZXJpbWVudC5MaXN0RXhwZXJpbWVudHNSZXNwb25zZSLEA5JBqQMKCmV4cGVyaW1lbnQSBExpc3QaEUxpc3QgZXhwZXJpbWVudHMuKhZ3ZWIudjEuZXhwZXJpbWVudC5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCERIPL3YxL2V4cGVyaW1lbnRzEsIEChBDcmVhdGVFeHBlcmltZW50Ei0uYnVja2V0ZWVyLmV4cGVyaW1lbnQuQ3JlYXRlRXhwZXJpbWVudFJlcXVlc3QaLi5idWNrZXRlZXIuZXhwZXJpbWVudC5DcmVhdGVFeHBlcmltZW50UmVzcG9uc2UizgOSQbEDCgpleHBlcmltZW50EgZDcmVhdGUaFUNyZWF0ZSBhbiBleHBlcmltZW50LioYd2ViLnYxLmV4cGVyaW1lbnQuY3JlYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCEyIOL3YxL2V4cGVyaW1lbnQ6ASoScwoQVXBkYXRlRXhwZXJpbWVudBItLmJ1Y2tldGVlci5leHBlcmltZW50LlVwZGF0ZUV4cGVyaW1lbnRSZXF1ZXN0Gi4uYnVja2V0ZWVyLmV4cGVyaW1lbnQuVXBkYXRlRXhwZXJpbWVudFJlc3BvbnNlIgAScAoPU3RhcnRFeHBlcmltZW50EiwuYnVja2V0ZWVyLmV4cGVyaW1lbnQuU3RhcnRFeHBlcmltZW50UmVxdWVzdBotLmJ1Y2tldGVlci5leHBlcmltZW50LlN0YXJ0RXhwZXJpbWVudFJlc3BvbnNlIgAScwoQRmluaXNoRXhwZXJpbWVudBItLmJ1Y2tldGVlci5leHBlcmltZW50LkZpbmlzaEV4cGVyaW1lbnRSZXF1ZXN0Gi4uYnVja2V0ZWVyLmV4cGVyaW1lbnQuRmluaXNoRXhwZXJpbWVudFJlc3BvbnNlIgASbQoOU3RvcEV4cGVyaW1lbnQSKy5idWNrZXRlZXIuZXhwZXJpbWVudC5TdG9wRXhwZXJpbWVudFJlcXVlc3QaLC5idWNrZXRlZXIuZXhwZXJpbWVudC5TdG9wRXhwZXJpbWVudFJlc3BvbnNlIgASdgoRQXJjaGl2ZUV4cGVyaW1lbnQSLi5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlRXhwZXJpbWVudFJlcXVlc3QaLy5idWNrZXRlZXIuZXhwZXJpbWVudC5BcmNoaXZlRXhwZXJpbWVudFJlc3BvbnNlIgAScwoQRGVsZXRlRXhwZXJpbWVudBItLmJ1Y2tldGVlci5leHBlcmltZW50LkRlbGV0ZUV4cGVyaW1lbnRSZXF1ZXN0Gi4uYnVja2V0ZWVyLmV4cGVyaW1lbnQuRGVsZXRlRXhwZXJpbWVudFJlc3BvbnNlIgBCNFoyZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V4cGVyaW1lbnRiBnByb3RvMw==
featureDescriptor: CscDChpwcm90by9mZWF0dXJlL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUi2gIKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSHAoJYXR0cmlidXRlGAIgASgJUglhdHRyaWJ1dGUSPgoIb3BlcmF0b3IYAyABKA4yIi5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yEhYKBnZhbHVlcxgEIAMoCVIGdmFsdWVzIskBCghPcGVyYXRvchIKCgZFUVVBTFMQABIGCgJJThABEg0KCUVORFNfV0lUSBACEg8KC1NUQVJUU19XSVRIEAMSCwoHU0VHTUVOVBAEEgsKB0dSRUFURVIQBRIUChBHUkVBVEVSX09SX0VRVUFMEAYSCAoETEVTUxAHEhEKDUxFU1NfT1JfRVFVQUwQCBIKCgZCRUZPUkUQCRIJCgVBRlRFUhAKEhAKDEZFQVRVUkVfRkxBRxALEhMKD1BBUlRJQUxMWV9NQVRDSBAMQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK5AEKGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI2CgNBbnkSGQoIdHlwZV91cmwYASABKAlSB3R5cGVVcmwSFAoFdmFsdWUYAiABKAxSBXZhbHVlQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKhgQKHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIiMKC0RvdWJsZVZhbHVlEhQKBXZhbHVlGAEgASgBUgV2YWx1ZSIiCgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZSIiCgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZSIjCgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWUiIgoKSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWUiIwoLVUludDMyVmFsdWUSFAoFdmFsdWUYASABKA1SBXZhbHVlIiEKCUJvb2xWYWx1ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWUiIwoLU3RyaW5nVmFsdWUSFAoFdmFsdWUYASABKAlSBXZhbHVlIiIKCkJ5dGVzVmFsdWUSFAoFdmFsdWUYASABKAxSBXZhbHVlQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwq7BAoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiLQoNRml4ZWRTdHJhdGVneRIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbiKiAQoPUm9sbG91dFN0cmF0ZWd5EkwKCnZhcmlhdGlvbnMYASADKAsyLC5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3kuVmFyaWF0aW9uUgp2YXJpYXRpb25zGkEKCVZhcmlhdGlvbhIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIWCgZ3ZWlnaHQYAiABKAVSBndlaWdodCL4AQoIU3RyYXRlZ3kSNAoEdHlwZRgBIAEoDjIgLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5LlR5cGVSBHR5cGUSRwoOZml4ZWRfc3RyYXRlZ3kYAiABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5Ug1maXhlZFN0cmF0ZWd5Ek0KEHJvbGxvdXRfc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSD3JvbGxvdXRTdHJhdGVneSIeCgRUeXBlEgkKBUZJWEVEEAASCwoHUk9MTE9VVBABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqQIKGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvIoQBCgRSdWxlEg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgdjbGF1c2VzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqAEKGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSI8CgZUYXJnZXQSHAoJdmFyaWF0aW9uGAEgASgJUgl2YXJpYXRpb24SFAoFdXNlcnMYAiADKAlSBXVzZXJzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvQCCipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIvcBChNGZWF0dXJlTGFzdFVzZWRJbmZvEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uEiAKDGxhc3RfdXNlZF9hdBgDIAEoA1IKbGFzdFVzZWRBdBIdCgpjcmVhdGVkX2F0GAQgASgDUgljcmVhdGVkQXQSMgoVY2xpZW50X29sZGVzdF92ZXJzaW9uGAUgASgJUhNjbGllbnRPbGRlc3RWZXJzaW9uEjIKFWNsaWVudF9sYXRlc3RfdmVyc2lvbhgGIAEoCVITY2xpZW50TGF0ZXN0VmVyc2lvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCsIBCiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiUAoMUHJlcmVxdWlzaXRlEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKswwKG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvItIHCgdGZWF0dXJlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdlbmFibGVkGAQgASgIUgdlbmFibGVkEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSOQoWZXZhbHVhdGlvbl91bmRlbGF5YWJsZRgGIAEoCEICGAFSFWV2YWx1YXRpb25VbmRlbGF5YWJsZRIQCgN0dGwYByABKAVSA3R0bBIYCgd2ZXJzaW9uGAggASgFUgd2ZXJzaW9uEh0KCmNyZWF0ZWRfYXQYCSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAogASgDUgl1cGRhdGVkQXQSPAoKdmFyaWF0aW9ucxgLIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGA0gAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgOIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgPIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYECADKAlSBHRhZ3MSTAoObGFzdF91c2VkX2luZm8YESABKAsyJi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlTGFzdFVzZWRJbmZvUgxsYXN0VXNlZEluZm8SHgoKbWFpbnRhaW5lchgSIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgTIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRIaCghhcmNoaXZlZBgUIAEoCFIIYXJjaGl2ZWQSRQoNcHJlcmVxdWlzaXRlcxgVIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIjCg1zYW1wbGluZ19zZWVkGBYgASgJUgxzYW1wbGluZ1NlZWQiPgoNVmFyaWF0aW9uVHlwZRIKCgZTVFJJTkcQABILCgdCT09MRUFOEAESCgoGTlVNQkVSEAISCAoESlNPThADIlIKCEZlYXR1cmVzEjYKCGZlYXR1cmVzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMSDgoCaWQYAiABKAlSAmlkInMKEkVudmlyb25tZW50RmVhdHVyZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBI2CghmZWF0dXJlcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzImcKA1RhZxIOCgJpZBgBIAEoCVICaWQSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAQgASgJUgRuYW1lQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKtQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiggEKDFNlZ21lbnRVc2VycxIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSNAoFdXNlcnMYAiADKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlclIFdXNlcnMSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKoAUKIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSKtBAoLRmxhZ1RyaWdnZXISDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI3CgR0eXBlGAQgASgOMiMuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuVHlwZVIEdHlwZRI9CgZhY3Rpb24YBSABKA4yJS5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlci5BY3Rpb25SBmFjdGlvbhIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SIwoNdHJpZ2dlcl9jb3VudBgHIAEoBVIMdHJpZ2dlckNvdW50EioKEWxhc3RfdHJpZ2dlcmVkX2F0GAggASgDUg9sYXN0VHJpZ2dlcmVkQXQSFAoFdG9rZW4YCSABKAlSBXRva2VuEhoKCGRpc2FibGVkGAogASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAsgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgMIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkIioKBFR5cGUSEAoMVHlwZV9VTktOT1dOEAASEAoMVHlwZV9XRUJIT09LEAEiOwoGQWN0aW9uEhIKDkFjdGlvbl9VTktOT1dOEAASDQoJQWN0aW9uX09OEAESDgoKQWN0aW9uX09GRhACSgQIAxAEQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKwCMKG3Byb3RvL2ZlYXR1cmUvY29tbWFuZC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxogcHJvdG8vZmVhdHVyZS9mbGFnX3RyaWdnZXIucHJvdG8iOQoHQ29tbWFuZBIuCgdjb21tYW5kGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIHY29tbWFuZCK1AwoUQ3JlYXRlRmVhdHVyZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSEgoEdGFncxgFIAMoCVIEdGFncxJYChpkZWZhdWx0X29uX3ZhcmlhdGlvbl9pbmRleBgGIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhdkZWZhdWx0T25WYXJpYXRpb25JbmRleBJaChtkZWZhdWx0X29mZl92YXJpYXRpb25faW5kZXgYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIYZGVmYXVsdE9mZlZhcmlhdGlvbkluZGV4Ek8KDnZhcmlhdGlvbl90eXBlGAggASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlIhcKFUFyY2hpdmVGZWF0dXJlQ29tbWFuZCIZChdVbmFyY2hpdmVGZWF0dXJlQ29tbWFuZCIWChREZWxldGVGZWF0dXJlQ29tbWFuZCIqChRSZW5hbWVGZWF0dXJlQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIjwKGENoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24iuAEKKUNoYW5nZUJ1bGtVcGxvYWRTZWdtZW50VXNlcnNTdGF0dXNDb21tYW5kEjkKBnN0YXR1cxgBIAEoDjIhLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnQuU3RhdHVzUgZzdGF0dXMSOgoFc3RhdGUYAiABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUSFAoFY291bnQYAyABKANSBWNvdW50IiEKDUFkZFRhZ0NvbW1hbmQSEAoDdGFnGAEgASgJUgN0YWciJAoQUmVtb3ZlVGFnQ29tbWFuZBIQCgN0YWcYASABKAlSA3RhZyIWChRFbmFibGVGZWF0dXJlQ29tbWFuZCIXChVEaXNhYmxlRmVhdHVyZUNvbW1hbmQiYQoTQWRkVmFyaWF0aW9uQ29tbWFuZBIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24iKAoWUmVtb3ZlVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiQwobQ2hhbmdlVmFyaWF0aW9uVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUiQAoaQ2hhbmdlVmFyaWF0aW9uTmFtZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVQohQ2hhbmdlVmFyaWF0aW9uRGVzY3JpcHRpb25Db21tYW5kEg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iKwoZQ2hhbmdlT2ZmVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQiPwoZQWRkVXNlclRvVmFyaWF0aW9uQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSEgoEdXNlchgCIAEoCVIEdXNlciJECh5SZW1vdmVVc2VyRnJvbVZhcmlhdGlvbkNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBHVzZXIYAiABKAlSBHVzZXIiVwocQ2hhbmdlRGVmYXVsdFN0cmF0ZWd5Q29tbWFuZBI3CghzdHJhdGVneRgBIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSI9Cg5BZGRSdWxlQ29tbWFuZBIrCgRydWxlGAEgASgLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIEcnVsZSJ9ChlDaGFuZ2VSdWxlU3RyYXRlZ3lDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSNwoIc3RyYXRlZ3kYAyABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIIc3RyYXRlZ3kiNAoXQ2hhbmdlUnVsZXNPcmRlckNvbW1hbmQSGQoIcnVsZV9pZHMYAiADKAlSB3J1bGVJZHMiIwoRRGVsZXRlUnVsZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkIl4KEEFkZENsYXVzZUNvbW1hbmQSFwoHcnVsZV9pZBgBIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgCIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlIj4KE0RlbGV0ZUNsYXVzZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCJlChxDaGFuZ2VDbGF1c2VBdHRyaWJ1dGVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSHAoJYXR0cmlidXRlGAMgASgJUglhdHRyaWJ1dGUihgEKG0NoYW5nZUNsYXVzZU9wZXJhdG9yQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEj4KCG9wZXJhdG9yGAMgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvciJWChVBZGRDbGF1c2VWYWx1ZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIUCgV2YWx1ZRgDIAEoCVIFdmFsdWUiWQoYUmVtb3ZlQ2xhdXNlVmFsdWVDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSFAoFdmFsdWUYAyABKAlSBXZhbHVlIoMBChpDaGFuZ2VGaXhlZFN0cmF0ZWd5Q29tbWFuZBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjwKCHN0cmF0ZWd5GAMgASgLMiAuYnVja2V0ZWVyLmZlYXR1cmUuRml4ZWRTdHJhdGVneVIIc3RyYXRlZ3kihwEKHENoYW5nZVJvbGxvdXRTdHJhdGVneUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI+CghzdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIIc3RyYXRlZ3kiTAoUQ3JlYXRlU2VnbWVudENvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iFgoURGVsZXRlU2VnbWVudENvbW1hbmQiLgoYQ2hhbmdlU2VnbWVudE5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiQwofQ2hhbmdlU2VnbWVudERlc2NyaXB0aW9uQ29tbWFuZBIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24ibgoVQWRkU2VnbWVudFVzZXJDb21tYW5kEhkKCHVzZXJfaWRzGAEgAygJUgd1c2VySWRzEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlInEKGERlbGV0ZVNlZ21lbnRVc2VyQ29tbWFuZBIZCgh1c2VyX2lkcxgBIAMoCVIHdXNlcklkcxI6CgVzdGF0ZRgCIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSJvCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzQ29tbWFuZBISCgRkYXRhGAEgASgMUgRkYXRhEjoKBXN0YXRlGAIgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlIiAKHkluY3JlbWVudEZlYXR1cmVWZXJzaW9uQ29tbWFuZCJCChNDbG9uZUZlYXR1cmVDb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkSgQIARACIhoKGFJlc2V0U2FtcGxpbmdTZWVkQ29tbWFuZCJdChZBZGRQcmVyZXF1aXNpdGVDb21tYW5kEkMKDHByZXJlcXVpc2l0ZRgBIAEoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVIMcHJlcmVxdWlzaXRlIjoKGVJlbW92ZVByZXJlcXVpc2l0ZUNvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkImkKIkNoYW5nZVByZXJlcXVpc2l0ZVZhcmlhdGlvbkNvbW1hbmQSQwoMcHJlcmVxdWlzaXRlGAEgASgLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUgxwcmVyZXF1aXNpdGUi0wEKGENyZWF0ZUZsYWdUcmlnZ2VyQ29tbWFuZBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgCIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAMgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uIhkKF1Jlc2V0RmxhZ1RyaWdnZXJDb21tYW5kIkcKI0NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbiIaChhFbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQiGwoZRGlzYWJsZUZsYWdUcmlnZ2VyQ29tbWFuZCIaChhEZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQiHwodVXBkYXRlRmxhZ1RyaWdnZXJVc2FnZUNvbW1hbmRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqeAgoacHJvdG8vZmVhdHVyZS9yZWFzb24ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIrEBCgZSZWFzb24SMgoEdHlwZRgBIAEoDjIeLmJ1Y2tldGVlci5mZWF0dXJlLlJlYXNvbi5UeXBlUgR0eXBlEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCJaCgRUeXBlEgoKBlRBUkdFVBAAEggKBFJVTEUQARILCgdERUZBVUxUEAMSCgoGQ0xJRU5UEAQSEQoNT0ZGX1ZBUklBVElPThAFEhAKDFBSRVJFUVVJU0lURRAGQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKmAYKHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90byLjAgoKRXZhbHVhdGlvbhIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SFwoHdXNlcl9pZBgEIAEoCVIGdXNlcklkEiEKDHZhcmlhdGlvbl9pZBgFIAEoCVILdmFyaWF0aW9uSWQSPgoJdmFyaWF0aW9uGAYgASgLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uQgIYAVIJdmFyaWF0aW9uEjEKBnJlYXNvbhgHIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlJlYXNvblIGcmVhc29uEicKD3ZhcmlhdGlvbl92YWx1ZRgIIAEoCVIOdmFyaWF0aW9uVmFsdWUSJQoOdmFyaWF0aW9uX25hbWUYCSABKAlSDXZhcmlhdGlvbk5hbWUihgIKD1VzZXJFdmFsdWF0aW9ucxISCgJpZBgBIAEoCUICGAFSAmlkEj8KC2V2YWx1YXRpb25zGAIgAygLMh0uYnVja2V0ZWVyLmZlYXR1cmUuRXZhbHVhdGlvblILZXZhbHVhdGlvbnMSHQoKY3JlYXRlZF9hdBgDIAEoA1IJY3JlYXRlZEF0EjAKFGFyY2hpdmVkX2ZlYXR1cmVfaWRzGAQgAygJUhJhcmNoaXZlZEZlYXR1cmVJZHMSIQoMZm9yY2VfdXBkYXRlGAUgASgIUgtmb3JjZVVwZGF0ZSIqCgVTdGF0ZRIKCgZRVUVVRUQQABILCgdQQVJUSUFMEAESCAoERlVMTBACQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKhwUKFWdvb2dsZS9hcGkvaHR0cC5wcm90bxIKZ29vZ2xlLmFwaSJ5CgRIdHRwEioKBXJ1bGVzGAEgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIFcnVsZXMSRQofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCFIcZnVsbHlEZWNvZGVSZXNlcnZlZEV4cGFuc2lvbiK1AgoISHR0cFJ1bGUSGgoIc2VsZWN0b3IYASABKAlSCHNlbGVjdG9yEhIKA2dldBgCIAEoCUgAUgNnZXQSEgoDcHV0GAMgASgJSABSA3B1dBIUCgRwb3N0GAQgASgJSABSBHBvc3QSGAoGZGVsZXRlGAUgASgJSABSBmRlbGV0ZRIWCgVwYXRjaBgGIAEoCUgAUgVwYXRjaBI3CgZjdXN0b20YCCABKAsyHS5nb29nbGUuYXBpLkN1c3RvbUh0dHBQYXR0ZXJuSABSBmN1c3RvbRISCgRib2R5GAcgASgJUgRib2R5EkUKE2FkZGl0aW9uYWxfYmluZGluZ3MYCyADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUhJhZGRpdGlvbmFsQmluZGluZ3NCCQoHcGF0dGVybiI7ChFDdXN0b21IdHRwUGF0dGVybhISCgRraW5kGAEgASgJUgRraW5kEhIKBHBhdGgYAiABKAlSBHBhdGhCagoOY29tLmdvb2dsZS5hcGlCCUh0dHBQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc/gBAaICBEdBUEliBnByb3RvMwrhRgogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJNChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUi/gQKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSGAoHZWRpdGlvbhgNIAEoCVIHZWRpdGlvbiK5BgoPRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSOwoFZmllbGQYAiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SBWZpZWxkEkMKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEkEKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1IKbmVzdGVkVHlwZRJBCgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSWAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVIOZXh0ZW5zaW9uUmFuZ2USRAoKb25lb2ZfZGVjbBgIIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1IJb25lb2ZEZWNsEjkKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNSB29wdGlvbnMSVQoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgKIAMoCVIMcmVzZXJ2ZWROYW1lGnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKtBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhJoCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEUgx2ZXJpZmljYXRpb24aswEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIjCgtpc19yZXBlYXRlZBgEIAEoCEICGAFSCmlzUmVwZWF0ZWQSGgoIcmVzZXJ2ZWQYBSABKAhSCHJlc2VydmVkEhoKCHJlcGVhdGVkGAYgASgIUghyZXBlYXRlZCI0ChFWZXJpZmljYXRpb25TdGF0ZRIPCgtERUNMQVJBVElPThAAEg4KClVOVkVSSUZJRUQQASoJCOgHEICAgIACIsEGChRGaWVsZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgDIAEoBVIGbnVtYmVyEkEKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsUgVsYWJlbBI+CgR0eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSBHR5cGUSGwoJdHlwZV9uYW1lGAYgASgJUgh0eXBlTmFtZRIaCghleHRlbmRlZRgCIAEoCVIIZXh0ZW5kZWUSIwoNZGVmYXVsdF92YWx1ZRgHIAEoCVIMZGVmYXVsdFZhbHVlEh8KC29uZW9mX2luZGV4GAkgASgFUgpvbmVvZkluZGV4EhsKCWpzb25fbmFtZRgKIAEoCVIIanNvbk5hbWUSNwoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNSB29wdGlvbnMSJwoPcHJvdG8zX29wdGlvbmFsGBEgASgIUg5wcm90bzNPcHRpb25hbCK2AgoEVHlwZRIPCgtUWVBFX0RPVUJMRRABEg4KClRZUEVfRkxPQVQQAhIOCgpUWVBFX0lOVDY0EAMSDwoLVFlQRV9VSU5UNjQQBBIOCgpUWVBFX0lOVDMyEAUSEAoMVFlQRV9GSVhFRDY0EAYSEAoMVFlQRV9GSVhFRDMyEAcSDQoJVFlQRV9CT09MEAgSDwoLVFlQRV9TVFJJTkcQCRIOCgpUWVBFX0dST1VQEAoSEAoMVFlQRV9NRVNTQUdFEAsSDgoKVFlQRV9CWVRFUxAMEg8KC1RZUEVfVUlOVDMyEA0SDQoJVFlQRV9FTlVNEA4SEQoNVFlQRV9TRklYRUQzMhAPEhEKDVRZUEVfU0ZJWEVENjQQEBIPCgtUWVBFX1NJTlQzMhAREg8KC1RZUEVfU0lOVDY0EBIiQwoFTGFiZWwSEgoOTEFCRUxfT1BUSU9OQUwQARISCg5MQUJFTF9SRVFVSVJFRBACEhIKDkxBQkVMX1JFUEVBVEVEEAMiYwoUT25lb2ZEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI3CgdvcHRpb25zGAIgASgLMh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1IHb3B0aW9ucyLjAgoTRW51bURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj8KBXZhbHVlGAIgAygLMikuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1IFdmFsdWUSNgoHb3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1IHb3B0aW9ucxJdCg5yZXNlcnZlZF9yYW5nZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYBSADKAlSDHJlc2VydmVkTmFtZRo7ChFFbnVtUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQigwEKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgCIAEoBVIGbnVtYmVyEjsKB29wdGlvbnMYAyABKAsyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1IHb3B0aW9ucyKnAQoWU2VydmljZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj4KBm1ldGhvZBgCIAMoCzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9SBm1ldGhvZBI5CgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zUgdvcHRpb25zIokCChVNZXRob2REZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIdCgppbnB1dF90eXBlGAIgASgJUglpbnB1dFR5cGUSHwoLb3V0cHV0X3R5cGUYAyABKAlSCm91dHB1dFR5cGUSOAoHb3B0aW9ucxgEIAEoCzIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zUgdvcHRpb25zEjAKEGNsaWVudF9zdHJlYW1pbmcYBSABKAg6BWZhbHNlUg9jbGllbnRTdHJlYW1pbmcSMAoQc2VydmVyX3N0cmVhbWluZxgGIAEoCDoFZmFsc2VSD3NlcnZlclN0cmVhbWluZyKRCQoLRmlsZU9wdGlvbnMSIQoMamF2YV9wYWNrYWdlGAEgASgJUgtqYXZhUGFja2FnZRIwChRqYXZhX291dGVyX2NsYXNzbmFtZRgIIAEoCVISamF2YU91dGVyQ2xhc3NuYW1lEjUKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlUhFqYXZhTXVsdGlwbGVGaWxlcxJECh1qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaBgUIAEoCEICGAFSGWphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gSOgoWamF2YV9zdHJpbmdfY2hlY2tfdXRmOBgbIAEoCDoFZmFsc2VSE2phdmFTdHJpbmdDaGVja1V0ZjgSUwoMb3B0aW1pemVfZm9yGAkgASgOMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZToFU1BFRURSC29wdGltaXplRm9yEh0KCmdvX3BhY2thZ2UYCyABKAlSCWdvUGFja2FnZRI1ChNjY19nZW5lcmljX3NlcnZpY2VzGBAgASgIOgVmYWxzZVIRY2NHZW5lcmljU2VydmljZXMSOQoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZVITamF2YUdlbmVyaWNTZXJ2aWNlcxI1ChNweV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZVIRcHlHZW5lcmljU2VydmljZXMSNwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZhbHNlUhJwaHBHZW5lcmljU2VydmljZXMSJQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSLgoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoEdHJ1ZVIOY2NFbmFibGVBcmVuYXMSKgoRb2JqY19jbGFzc19wcmVmaXgYJCABKAlSD29iamNDbGFzc1ByZWZpeBIpChBjc2hhcnBfbmFtZXNwYWNlGCUgASgJUg9jc2hhcnBOYW1lc3BhY2USIQoMc3dpZnRfcHJlZml4GCcgASgJUgtzd2lmdFByZWZpeBIoChBwaHBfY2xhc3NfcHJlZml4GCggASgJUg5waHBDbGFzc1ByZWZpeBIjCg1waHBfbmFtZXNwYWNlGCkgASgJUgxwaHBOYW1lc3BhY2USNAoWcGhwX21ldGFkYXRhX25hbWVzcGFjZRgsIAEoCVIUcGhwTWV0YWRhdGFOYW1lc3BhY2USIQoMcnVieV9wYWNrYWdlGC0gASgJUgtydWJ5UGFja2FnZRJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiI6CgxPcHRpbWl6ZU1vZGUSCQoFU1BFRUQQARINCglDT0RFX1NJWkUQAhIQCgxMSVRFX1JVTlRJTUUQAyoJCOgHEICAgIACSgQIJhAnIrsDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoihQkKDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSgoGdGFyZ2V0GBIgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlQgIYAVIGdGFyZ2V0EkgKB3RhcmdldHMYEyADKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVSB3RhcmdldHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iLwoFQ1R5cGUSCgoGU1RSSU5HEAASCAoEQ09SRBABEhAKDFNUUklOR19QSUVDRRACIjUKBkpTVHlwZRINCglKU19OT1JNQUwQABINCglKU19TVFJJTkcQARINCglKU19OVU1CRVIQAiJVCg9PcHRpb25SZXRlbnRpb24SFQoRUkVURU5USU9OX1VOS05PV04QABIVChFSRVRFTlRJT05fUlVOVElNRRABEhQKEFJFVEVOVElPTl9TT1VSQ0UQAiKMAgoQT3B0aW9uVGFyZ2V0VHlwZRIXChNUQVJHRVRfVFlQRV9VTktOT1dOEAASFAoQVEFSR0VUX1RZUEVfRklMRRABEh8KG1RBUkdFVF9UWVBFX0VYVEVOU0lPTl9SQU5HRRACEhcKE1RBUkdFVF9UWVBFX01FU1NBR0UQAxIVChFUQVJHRVRfVFlQRV9GSUVMRBAEEhUKEVRBUkdFVF9UWVBFX09ORU9GEAUSFAoQVEFSR0VUX1RZUEVfRU5VTRAGEhoKFlRBUkdFVF9UWVBFX0VOVU1fRU5UUlkQBxIXChNUQVJHRVRfVFlQRV9TRVJWSUNFEAgSFgoSVEFSR0VUX1RZUEVfTUVUSE9EEAkqCQjoBxCAgICAAkoECAQQBSJzCgxPbmVvZk9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKYAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYingEKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKcAQoOU2VydmljZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLgAgoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnAgoOU291cmNlQ29kZUluZm8SRAoIbG9jYXRpb24YASADKAsyKC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25SCGxvY2F0aW9uGs4BCghMb2NhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIWCgRzcGFuGAIgAygFQgIQAVIEc3BhbhIpChBsZWFkaW5nX2NvbW1lbnRzGAMgASgJUg9sZWFkaW5nQ29tbWVudHMSKwoRdHJhaWxpbmdfY29tbWVudHMYBCABKAlSEHRyYWlsaW5nQ29tbWVudHMSOgoZbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cxgGIAMoCVIXbGVhZGluZ0RldGFjaGVkQ29tbWVudHMi0AIKEUdlbmVyYXRlZENvZGVJbmZvEk0KCmFubm90YXRpb24YASADKAsyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvblIKYW5ub3RhdGlvbhrrAQoKQW5ub3RhdGlvbhIWCgRwYXRoGAEgAygFQgIQAVIEcGF0aBIfCgtzb3VyY2VfZmlsZRgCIAEoCVIKc291cmNlRmlsZRIUCgViZWdpbhgDIAEoBVIFYmVnaW4SEAoDZW5kGAQgASgFUgNlbmQSUgoIc2VtYW50aWMYBSABKA4yNi5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5TZW1hbnRpY1IIc2VtYW50aWMiKAoIU2VtYW50aWMSCAoETk9ORRAAEgcKA1NFVBABEgkKBUFMSUFTEAJCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIQRGVzY3JpcHRvclByb3Rvc0gBWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGL4AQGiAgNHUEKqAhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgqoAgocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxIKZ29vZ2xlLmFwaRoVZ29vZ2xlL2FwaS9odHRwLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzpLCgRodHRwEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYsMq8IiABKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgRodHRwQm4KDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCugDCh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byq2AQoNRmllbGRCZWhhdmlvchIeChpGSUVMRF9CRUhBVklPUl9VTlNQRUNJRklFRBAAEgwKCE9QVElPTkFMEAESDAoIUkVRVUlSRUQQAhIPCgtPVVRQVVRfT05MWRADEg4KCklOUFVUX09OTFkQBBINCglJTU1VVEFCTEUQBRISCg5VTk9SREVSRURfTElTVBAGEhUKEU5PTl9FTVBUWV9ERUZBVUxUEAcSDgoKSURFTlRJRklFUhAIOmQKDmZpZWxkX2JlaGF2aW9yEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxicCCADKA4yGS5nb29nbGUuYXBpLkZpZWxkQmVoYXZpb3JCAhAAUg1maWVsZEJlaGF2aW9yQnAKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwrABAoVcHJvdG8vdXNlci91c2VyLnByb3RvEg5idWNrZXRlZXIudXNlciLeAwoEVXNlchIOCgJpZBgBIAEoCVICaWQSMgoEZGF0YRgCIAMoCzIeLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YUVudHJ5UgRkYXRhEkUKC3RhZ2dlZF9kYXRhGAMgAygLMiQuYnVja2V0ZWVyLnVzZXIuVXNlci5UYWdnZWREYXRhRW50cnlSCnRhZ2dlZERhdGESGwoJbGFzdF9zZWVuGAQgASgDUghsYXN0U2VlbhIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQafAoERGF0YRI6CgV2YWx1ZRgBIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YS5WYWx1ZUVudHJ5UgV2YWx1ZRo4CgpWYWx1ZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaWAoPVGFnZ2VkRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuYnVja2V0ZWVyLnVzZXIuVXNlci5EYXRhUgV2YWx1ZToCOAFCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3VzZXJiBnByb3RvMwqslwEKG3Byb3RvL2ZlYXR1cmUvc2VydmljZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxobcHJvdG8vZmVhdHVyZS9jb21tYW5kLnByb3RvGhtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoVcHJvdG8vdXNlci91c2VyLnByb3RvGhtwcm90by9mZWF0dXJlL3NlZ21lbnQucHJvdG8aIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8aGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8iUAoRR2V0RmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkoKEkdldEZlYXR1cmVSZXNwb25zZRI0CgdmZWF0dXJlGAEgASgLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIHZmVhdHVyZSJTChJHZXRGZWF0dXJlc1JlcXVlc3QSEAoDaWRzGAIgAygJUgNpZHMSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIiTQoTR2V0RmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzIvUFChNMaXN0RmVhdHVyZXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISEgoEdGFncxgDIAMoCVIEdGFncxJJCghvcmRlcl9ieRgEIAEoDjIuLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJeCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIeCgptYWludGFpbmVyGAcgASgJUgptYWludGFpbmVyEjQKB2VuYWJsZWQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEkEKDmhhc19leHBlcmltZW50GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaGFzRXhwZXJpbWVudBIlCg5zZWFyY2hfa2V5d29yZBgKIAEoCVINc2VhcmNoS2V5d29yZBI2CghhcmNoaXZlZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGFyY2hpdmVkEkcKEWhhc19wcmVyZXF1aXNpdGVzGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIQaGFzUHJlcmVxdWlzaXRlcxIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZCJXCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIICgRUQUdTEAQSCwoHRU5BQkxFRBAFIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQAUoECAYQByKHAQoUTGlzdEZlYXR1cmVzUmVzcG9uc2USNgoIZmVhdHVyZXMYASADKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUghmZWF0dXJlcxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAQoaTGlzdEVuYWJsZWRGZWF0dXJlc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchISCgR0YWdzGAMgAygJUgR0YWdzEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIm0KG0xpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZRI2CghmZWF0dXJlcxgBIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yIoYBChRDcmVhdGVGZWF0dXJlUmVxdWVzdBJBCgdjb21tYW5kGAEgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiTQoVQ3JlYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIs8FChRVcGRhdGVGZWF0dXJlUmVxdWVzdBIYCgdjb21tZW50GAEgASgJUgdjb21tZW50EiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkEg4KAmlkGAMgASgJUgJpZBIwCgRuYW1lGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAUgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbhISCgR0YWdzGAYgAygJUgR0YWdzEjQKB2VuYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUgdlbmFibGVkEjYKCGFyY2hpdmVkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIYXJjaGl2ZWQSPAoKdmFyaWF0aW9ucxgJIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxJFCg1wcmVyZXF1aXNpdGVzGAogAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEjMKB3RhcmdldHMYCyADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMSLQoFcnVsZXMYDCADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxJGChBkZWZhdWx0X3N0cmF0ZWd5GA0gASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSD2RlZmF1bHRTdHJhdGVneRJBCg1vZmZfdmFyaWF0aW9uGA4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgxvZmZWYXJpYXRpb24iTQoVVXBkYXRlRmVhdHVyZVJlc3BvbnNlEjQKB2ZlYXR1cmUYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlUgdmZWF0dXJlIrABChRFbmFibGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRW5hYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVEaXNhYmxlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZEaXNhYmxlRmVhdHVyZVJlc3BvbnNlIrIBChVBcmNoaXZlRmVhdHVyZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BcmNoaXZlRmVhdHVyZUNvbW1hbmRSB2NvbW1hbmQSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIYChZBcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrYBChdVbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGgoYVW5hcmNoaXZlRmVhdHVyZVJlc3BvbnNlIrABChREZWxldGVGZWF0dXJlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQQoHY29tbWFuZBgCIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVDb21tYW5kUgdjb21tYW5kEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGVsZXRlRmVhdHVyZVJlc3BvbnNlIt8DChtVcGRhdGVGZWF0dXJlRGV0YWlsc1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEl0KFnJlbmFtZV9mZWF0dXJlX2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuZmVhdHVyZS5SZW5hbWVGZWF0dXJlQ29tbWFuZFIUcmVuYW1lRmVhdHVyZUNvbW1hbmQSaQoaY2hhbmdlX2Rlc2NyaXB0aW9uX2NvbW1hbmQYAyABKAsyKy5idWNrZXRlZXIuZmVhdHVyZS5DaGFuZ2VEZXNjcmlwdGlvbkNvbW1hbmRSGGNoYW5nZURlc2NyaXB0aW9uQ29tbWFuZBJKChBhZGRfdGFnX2NvbW1hbmRzGAQgAygLMiAuYnVja2V0ZWVyLmZlYXR1cmUuQWRkVGFnQ29tbWFuZFIOYWRkVGFnQ29tbWFuZHMSUwoTcmVtb3ZlX3RhZ19jb21tYW5kcxgFIAMoCzIjLmJ1Y2tldGVlci5mZWF0dXJlLlJlbW92ZVRhZ0NvbW1hbmRSEXJlbW92ZVRhZ0NvbW1hbmRzEhgKB2NvbW1lbnQYByABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYCCABKAlSDWVudmlyb25tZW50SWRKBAgGEAciHgocVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSKvAQoeVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBI2Cghjb21tYW5kcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkNvbW1hbmRSCGNvbW1hbmRzEhgKB2NvbW1lbnQYBCABKAlSB2NvbW1lbnQSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiIQofVXBkYXRlRmVhdHVyZVZhcmlhdGlvbnNSZXNwb25zZSKhAgodVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QSDgoCaWQYASABKAlSAmlkEjYKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZFIIY29tbWFuZHMSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudBJJCgRmcm9tGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QuRnJvbVIEZnJvbRIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZCImCgRGcm9tEgsKB1VOS05PV04QABIICgRVU0VSEAESBwoDT1BTEAJKBAgDEAQiIAoeVXBkYXRlRmVhdHVyZVRhcmdldGluZ1Jlc3BvbnNlIpQBChNDbG9uZUZlYXR1cmVSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJACgdjb21tYW5kGAIgASgLMiYuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlQ29tbWFuZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCIWChRDbG9uZUZlYXR1cmVSZXNwb25zZSLZAQoUQ3JlYXRlU2VnbWVudFJlcXVlc3QSVAoHY29tbWFuZBgBIAEoCzInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIXCgRuYW1lGAMgASgJQgPgQQJSBG5hbWUSKgoOZW52aXJvbm1lbnRfaWQYBCABKAlCA+BBAlINZW52aXJvbm1lbnRJZBIgCgtkZXNjcmlwdGlvbhgFIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiTQoVQ3JlYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IloKEUdldFNlZ21lbnRSZXF1ZXN0EhMKAmlkGAEgASgJQgPgQQJSAmlkEioKDmVudmlyb25tZW50X2lkGAMgASgJQgPgQQJSDWVudmlyb25tZW50SWRKBAgCEAMiSgoSR2V0U2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IssEChNMaXN0U2VnbWVudHNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSQoIb3JkZXJfYnkYBCABKA4yLi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSXgoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMjUuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSMwoGc3RhdHVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSBnN0YXR1cxJDChBpc19pbl91c2Vfc3RhdHVzGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVINaXNJblVzZVN0YXR1cxIqCg5lbnZpcm9ubWVudF9pZBgJIAEoCUID4EECUg1lbnZpcm9ubWVudElkIlwKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0NPTk5FQ1RJT05TEAQSCQoFVVNFUlMQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgDEAQihwEKFExpc3RTZWdtZW50c1Jlc3BvbnNlEjYKCHNlZ21lbnRzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFIIc2VnbWVudHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiqQEKFERlbGV0ZVNlZ21lbnRSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJUCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudENvbW1hbmRCERgBkkEMMgpkZXByZWNhdGVkUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhcKFURlbGV0ZVNlZ21lbnRSZXNwb25zZSKVAgoUVXBkYXRlU2VnbWVudFJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkkKCGNvbW1hbmRzGAIgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuQ29tbWFuZEIRGAGSQQwyCmRlcHJlY2F0ZWRSCGNvbW1hbmRzEioKDmVudmlyb25tZW50X2lkGAQgASgJQgPgQQJSDWVudmlyb25tZW50SWQSMAoEbmFtZRgFIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb25KBAgDEAQiTQoVVXBkYXRlU2VnbWVudFJlc3BvbnNlEjQKB3NlZ21lbnQYASABKAsyGi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50UgdzZWdtZW50IpgBChVBZGRTZWdtZW50VXNlclJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkIKB2NvbW1hbmQYAiABKAsyKC5idWNrZXRlZXIuZmVhdHVyZS5BZGRTZWdtZW50VXNlckNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiGAoWQWRkU2VnbWVudFVzZXJSZXNwb25zZSKeAQoYRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJFCgdjb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhsKGURlbGV0ZVNlZ21lbnRVc2VyUmVzcG9uc2UiuAEKFUdldFNlZ21lbnRVc2VyUmVxdWVzdBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHdXNlcl9pZBgCIAEoCVIGdXNlcklkEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkSgQIBBAFIkwKFkdldFNlZ21lbnRVc2VyUmVzcG9uc2USMgoEdXNlchgBIAEoCzIeLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyUgR1c2VyIuYBChdMaXN0U2VnbWVudFVzZXJzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh0KCnNlZ21lbnRfaWQYAyABKAlSCXNlZ21lbnRJZBIxCgVzdGF0ZRgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgVzdGF0ZRIXCgd1c2VyX2lkGAUgASgJUgZ1c2VySWQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWRKBAgGEAciaAoYTGlzdFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEjQKBXVzZXJzGAEgAygLMh4uYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXJSBXVzZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yItACCh1CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIdCgpzZWdtZW50X2lkGAIgASgJUglzZWdtZW50SWQSXQoHY29tbWFuZBgDIAEoCzIwLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNDb21tYW5kQhEYAZJBDDIKZGVwcmVjYXRlZFIHY29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZBJICgRkYXRhGAUgASgMQjSSQTEyL3NlZ21lbnQgdXNlciBpZHMgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIG5ldyBsaW5lUgRkYXRhEjoKBXN0YXRlGAYgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlSgQIARACIiAKHkJ1bGtVcGxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSKzAQofQnVsa0Rvd25sb2FkU2VnbWVudFVzZXJzUmVxdWVzdBIiCgpzZWdtZW50X2lkGAIgASgJQgPgQQJSCXNlZ21lbnRJZBI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIqCg5lbnZpcm9ubWVudF9pZBgEIAEoCUID4EECUg1lbnZpcm9ubWVudElkSgQIARACIjYKIEJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1Jlc3BvbnNlEhIKBGRhdGEYASABKAxSBGRhdGEioQEKF0V2YWx1YXRlRmVhdHVyZXNSZXF1ZXN0EigKBHVzZXIYASABKAsyFC5idWNrZXRlZXIudXNlci5Vc2VyUgR1c2VyEhAKA3RhZxgDIAEoCVIDdGFnEh0KCmZlYXR1cmVfaWQYBCABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgFIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJpChhFdmFsdWF0ZUZlYXR1cmVzUmVzcG9uc2USTQoQdXNlcl9ldmFsdWF0aW9ucxgBIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlVzZXJFdmFsdWF0aW9uc1IPdXNlckV2YWx1YXRpb25zIqwDCg9MaXN0VGFnc1JlcXVlc3QSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchJFCghvcmRlcl9ieRgEIAEoDjIqLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EloKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjIxLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RUYWdzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiSAoHT3JkZXJCeRILCgdERUZBVUxUEAASBgoCSUQQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBE5BTUUQBCIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIidwoQTGlzdFRhZ3NSZXNwb25zZRIqCgR0YWdzGAEgAygLMhYuYnVja2V0ZWVyLmZlYXR1cmUuVGFnUgR0YWdzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IrMBChhDcmVhdGVGbGFnVHJpZ2dlclJlcXVlc3QSagobY3JlYXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAIgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhjcmVhdGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgBEAIicAoZQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiwwEKGERlbGV0ZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZGVsZXRlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJDb21tYW5kUhhkZWxldGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSLmAQoYVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBKMAQonY2hhbmdlX2ZsYWdfdHJpZ2dlcl9kZXNjcmlwdGlvbl9jb21tYW5kGAMgASgLMjYuYnVja2V0ZWVyLmZlYXR1cmUuQ2hhbmdlRmxhZ1RyaWdnZXJEZXNjcmlwdGlvbkNvbW1hbmRSI2NoYW5nZUZsYWdUcmlnZ2VyRGVzY3JpcHRpb25Db21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIhsKGVVwZGF0ZUZsYWdUcmlnZ2VyUmVzcG9uc2UiwwEKGEVuYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSagobZW5hYmxlX2ZsYWdfdHJpZ2dlcl9jb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJDb21tYW5kUhhlbmFibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiGwoZRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSLHAQoZRGlzYWJsZUZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSbQocZGlzYWJsZV9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmRSGWRpc2FibGVGbGFnVHJpZ2dlckNvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgCEAMiHAoaRGlzYWJsZUZsYWdUcmlnZ2VyUmVzcG9uc2UivwEKF1Jlc2V0RmxhZ1RyaWdnZXJSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJnChpyZXNldF9mbGFnX3RyaWdnZXJfY29tbWFuZBgDIAEoCzIqLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJDb21tYW5kUhdyZXNldEZsYWdUcmlnZ2VyQ29tbWFuZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAIQAyJvChhSZXNldEZsYWdUcmlnZ2VyUmVzcG9uc2USQQoMZmxhZ190cmlnZ2VyGAEgASgLMh4uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJSC2ZsYWdUcmlnZ2VyEhAKA3VybBgCIAEoCVIDdXJsIlQKFUdldEZsYWdUcmlnZ2VyUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWRKBAgCEAMibQoWR2V0RmxhZ1RyaWdnZXJSZXNwb25zZRJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiqgMKF0xpc3RGbGFnVHJpZ2dlcnNSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIbCglwYWdlX3NpemUYBCABKAVSCHBhZ2VTaXplEk0KCG9yZGVyX2J5GAUgASgOMjIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJiCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yOS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOZW52aXJvbm1lbnRfaWQYByABKAlSDWVudmlyb25tZW50SWQiNgoHT3JkZXJCeRILCgdERUZBVUxUEAASDgoKQ1JFQVRFRF9BVBABEg4KClVQREFURURfQVQQAiIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgCEAMiowIKGExpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZRJjCg1mbGFnX3RyaWdnZXJzGAEgAygLMj4uYnVja2V0ZWVyLmZlYXR1cmUuTGlzdEZsYWdUcmlnZ2Vyc1Jlc3BvbnNlLkZsYWdUcmlnZ2VyV2l0aFVybFIMZmxhZ1RyaWdnZXJzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50GmkKEkZsYWdUcmlnZ2VyV2l0aFVybBJBCgxmbGFnX3RyaWdnZXIYASABKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlclILZmxhZ1RyaWdnZXISEAoDdXJsGAIgASgJUgN1cmwiMQoZRmxhZ1RyaWdnZXJXZWJob29rUmVxdWVzdBIUCgV0b2tlbhgBIAEoCVIFdG9rZW4iHAoaRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UymjkKDkZlYXR1cmVTZXJ2aWNlElsKCkdldEZlYXR1cmUSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRGZWF0dXJlUmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldEZlYXR1cmVSZXNwb25zZSIAEl4KC0dldEZlYXR1cmVzEiUuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXF1ZXN0GiYuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmVhdHVyZXNSZXNwb25zZSIAEmEKDExpc3RGZWF0dXJlcxImLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGZWF0dXJlc1JlcXVlc3QaJy5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmVhdHVyZXNSZXNwb25zZSIAEnYKE0xpc3RFbmFibGVkRmVhdHVyZXMSLS5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RW5hYmxlZEZlYXR1cmVzUmVxdWVzdBouLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RFbmFibGVkRmVhdHVyZXNSZXNwb25zZSIAEmQKDUNyZWF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5DcmVhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZUZlYXR1cmVSZXNwb25zZSIAEmQKDVVwZGF0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVSZXNwb25zZSIAEmcKDUVuYWJsZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5FbmFibGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkVuYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmoKDkRpc2FibGVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuRGlzYWJsZUZlYXR1cmVSZXNwb25zZSIDiAIBEmcKDkFyY2hpdmVGZWF0dXJlEiguYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEm0KEFVuYXJjaGl2ZUZlYXR1cmUSKi5idWNrZXRlZXIuZmVhdHVyZS5VbmFyY2hpdmVGZWF0dXJlUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlVuYXJjaGl2ZUZlYXR1cmVSZXNwb25zZSIAEmQKDURlbGV0ZUZlYXR1cmUSJy5idWNrZXRlZXIuZmVhdHVyZS5EZWxldGVGZWF0dXJlUmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZUZlYXR1cmVSZXNwb25zZSIAEnkKFFVwZGF0ZUZlYXR1cmVEZXRhaWxzEi4uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXF1ZXN0Gi8uYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZURldGFpbHNSZXNwb25zZSIAEoIBChdVcGRhdGVGZWF0dXJlVmFyaWF0aW9ucxIxLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVxdWVzdBoyLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZUZlYXR1cmVWYXJpYXRpb25zUmVzcG9uc2UiABJ/ChZVcGRhdGVGZWF0dXJlVGFyZ2V0aW5nEjAuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmVhdHVyZVRhcmdldGluZ1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVGZWF0dXJlVGFyZ2V0aW5nUmVzcG9uc2UiABJhCgxDbG9uZUZlYXR1cmUSJi5idWNrZXRlZXIuZmVhdHVyZS5DbG9uZUZlYXR1cmVSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuQ2xvbmVGZWF0dXJlUmVzcG9uc2UiABKmBAoNQ3JlYXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkNyZWF0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlU2VnbWVudFJlc3BvbnNlIsEDkkGnAwoHc2VnbWVudBIGQ3JlYXRlGhFDcmVhdGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuY3JlYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCECILL3YxL3NlZ21lbnQ6ASoSkQQKCkdldFNlZ21lbnQSJC5idWNrZXRlZXIuZmVhdHVyZS5HZXRTZWdtZW50UmVxdWVzdBolLmJ1Y2tldGVlci5mZWF0dXJlLkdldFNlZ21lbnRSZXNwb25zZSK1A5JBngMKB3NlZ21lbnQSA0dldBoOR2V0IGEgc2VnbWVudC4qEndlYi52MS5zZWdtZW50LmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg0SCy92MS9zZWdtZW50EpoECgxMaXN0U2VnbWVudHMSJi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudHNSZXF1ZXN0GicuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFNlZ21lbnRzUmVzcG9uc2UiuAOSQaADCgdzZWdtZW50EgRMaXN0Gg5MaXN0IHNlZ21lbnRzLioTd2ViLnYxLnNlZ21lbnQubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAg4SDC92MS9zZWdtZW50cxKjBAoNRGVsZXRlU2VnbWVudBInLmJ1Y2tldGVlci5mZWF0dXJlLkRlbGV0ZVNlZ21lbnRSZXF1ZXN0GiguYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFJlc3BvbnNlIr4DkkGnAwoHc2VnbWVudBIGRGVsZXRlGhFEZWxldGUgYSBzZWdtZW50LioVd2ViLnYxLnNlZ21lbnQuZGVsZXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDSoLL3YxL3NlZ21lbnQSpgQKDVVwZGF0ZVNlZ21lbnQSJy5idWNrZXRlZXIuZmVhdHVyZS5VcGRhdGVTZWdtZW50UmVxdWVzdBooLmJ1Y2tldGVlci5mZWF0dXJlLlVwZGF0ZVNlZ21lbnRSZXNwb25zZSLBA5JBpwMKB3NlZ21lbnQSBlVwZGF0ZRoRVXBkYXRlIGEgc2VnbWVudC4qFXdlYi52MS5zZWdtZW50LnVwZGF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhAyCy92MS9zZWdtZW50OgEqEmoKDkFkZFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuQWRkU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEnMKEURlbGV0ZVNlZ21lbnRVc2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlU2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEmoKDkdldFNlZ21lbnRVc2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0U2VnbWVudFVzZXJSZXNwb25zZSIDiAIBEm0KEExpc3RTZWdtZW50VXNlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0U2VnbWVudFVzZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RTZWdtZW50VXNlcnNSZXNwb25zZSIAEuwEChZCdWxrVXBsb2FkU2VnbWVudFVzZXJzEjAuYnVja2V0ZWVyLmZlYXR1cmUuQnVsa1VwbG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMS5idWNrZXRlZXIuZmVhdHVyZS5CdWxrVXBsb2FkU2VnbWVudFVzZXJzUmVzcG9uc2Ui7AOSQcADCgdzZWdtZW50EgtCdWxrIHVwbG9hZBoaQnVsayB1cGxvYWQgc2VnbWVudCB1c2Vycy4qIHdlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfdXBsb2FkSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCIiIdL3YxL3NlZ21lbnRfdXNlcnMvYnVsa191cGxvYWQ6ASoS9wQKGEJ1bGtEb3dubG9hZFNlZ21lbnRVc2VycxIyLmJ1Y2tldGVlci5mZWF0dXJlLkJ1bGtEb3dubG9hZFNlZ21lbnRVc2Vyc1JlcXVlc3QaMy5idWNrZXRlZXIuZmVhdHVyZS5CdWxrRG93bmxvYWRTZWdtZW50VXNlcnNSZXNwb25zZSLxA5JBxgMKB3NlZ21lbnQSDUJ1bGsgZG93bmxvYWQaHEJ1bGsgZG93bmxvYWQgc2VnbWVudCB1c2Vycy4qIndlYi52MS5zZWdtZW50X3VzZXJzLmJ1bGtfZG93bmxvYWRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIhEh8vdjEvc2VnbWVudF91c2Vycy9idWxrX2Rvd25sb2FkEm0KEEV2YWx1YXRlRmVhdHVyZXMSKi5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0ZUZlYXR1cmVzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRlRmVhdHVyZXNSZXNwb25zZSIAElUKCExpc3RUYWdzEiIuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXF1ZXN0GiMuYnVja2V0ZWVyLmZlYXR1cmUuTGlzdFRhZ3NSZXNwb25zZSIAEnAKEUNyZWF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuQ3JlYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEVVwZGF0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuVXBkYXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEUVuYWJsZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRW5hYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEnMKEkRpc2FibGVGbGFnVHJpZ2dlchIsLmJ1Y2tldGVlci5mZWF0dXJlLkRpc2FibGVGbGFnVHJpZ2dlclJlcXVlc3QaLS5idWNrZXRlZXIuZmVhdHVyZS5EaXNhYmxlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEFJlc2V0RmxhZ1RyaWdnZXISKi5idWNrZXRlZXIuZmVhdHVyZS5SZXNldEZsYWdUcmlnZ2VyUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLlJlc2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEnAKEURlbGV0ZUZsYWdUcmlnZ2VyEisuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXF1ZXN0GiwuYnVja2V0ZWVyLmZlYXR1cmUuRGVsZXRlRmxhZ1RyaWdnZXJSZXNwb25zZSIAEmcKDkdldEZsYWdUcmlnZ2VyEiguYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXF1ZXN0GikuYnVja2V0ZWVyLmZlYXR1cmUuR2V0RmxhZ1RyaWdnZXJSZXNwb25zZSIAEm0KEExpc3RGbGFnVHJpZ2dlcnMSKi5idWNrZXRlZXIuZmVhdHVyZS5MaXN0RmxhZ1RyaWdnZXJzUmVxdWVzdBorLmJ1Y2tldGVlci5mZWF0dXJlLkxpc3RGbGFnVHJpZ2dlcnNSZXNwb25zZSIAEpQBChJGbGFnVHJpZ2dlcldlYmhvb2sSLC5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlcldlYmhvb2tSZXF1ZXN0Gi0uYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXJXZWJob29rUmVzcG9uc2UiIYLT5JMCGyIZL3dlYmhvb2svdHJpZ2dlcnMve3Rva2VufUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8z
accountDescriptor: CucDCiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IukCCg1FbnZpcm9ubWVudFYyEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIdCgpwcm9qZWN0X2lkGAUgASgJUglwcm9qZWN0SWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEh0KCmNyZWF0ZWRfYXQYByABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAggASgDUgl1cGRhdGVkQXQSJwoPb3JnYW5pemF0aW9uX2lkGAkgASgJUg5vcmdhbml6YXRpb25JZBInCg9yZXF1aXJlX2NvbW1lbnQYCiABKAhSDnJlcXVpcmVDb21tZW50EiwKEmZlYXR1cmVfZmxhZ19jb3VudBgLIAEoBVIQZmVhdHVyZUZsYWdDb3VudEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwr9AwofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IoMDCgdQcm9qZWN0Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYAyABKAhSCGRpc2FibGVkEhQKBXRyaWFsGAQgASgIUgV0cmlhbBIjCg1jcmVhdG9yX2VtYWlsGAUgASgJUgxjcmVhdG9yRW1haWwSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAggASgJUgRuYW1lEhkKCHVybF9jb2RlGAkgASgJUgd1cmxDb2RlEicKD29yZ2FuaXphdGlvbl9pZBgKIAEoCVIOb3JnYW5pemF0aW9uSWQSKwoRZW52aXJvbm1lbnRfY291bnQYCyABKAVSEGVudmlyb25tZW50Q291bnQSLAoSZmVhdHVyZV9mbGFnX2NvdW50GAwgASgFUhBmZWF0dXJlRmxhZ0NvdW50QjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCq8ECiRwcm90by9lbnZpcm9ubWVudC9vcmdhbml6YXRpb24ucHJvdG8SFWJ1Y2tldGVlci5lbnZpcm9ubWVudCKwAwoMT3JnYW5pemF0aW9uEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgFIAEoCFIIZGlzYWJsZWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEhQKBXRyaWFsGAcgASgIUgV0cmlhbBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0EiEKDHN5c3RlbV9hZG1pbhgKIAEoCFILc3lzdGVtQWRtaW4SIwoNcHJvamVjdF9jb3VudBgLIAEoBVIMcHJvamVjdENvdW50EisKEWVudmlyb25tZW50X2NvdW50GAwgASgFUhBlbnZpcm9ubWVudENvdW50Eh0KCnVzZXJfY291bnQYDSABKAVSCXVzZXJDb3VudBIfCgtvd25lcl9lbWFpbBgOIAEoCVIKb3duZXJFbWFpbEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqQAwohcHJvdG8vYWNjb3VudC9zZWFyY2hfZmlsdGVyLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudCLpAQoMU2VhcmNoRmlsdGVyEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhQKBXF1ZXJ5GAMgASgJUgVxdWVyeRJRChJmaWx0ZXJfdGFyZ2V0X3R5cGUYBCABKA4yIy5idWNrZXRlZXIuYWNjb3VudC5GaWx0ZXJUYXJnZXRUeXBlUhBmaWx0ZXJUYXJnZXRUeXBlEiUKDmVudmlyb25tZW50X2lkGAUgASgJUg1lbnZpcm9ubWVudElkEiUKDmRlZmF1bHRfZmlsdGVyGAYgASgIUg1kZWZhdWx0RmlsdGVyKjEKEEZpbHRlclRhcmdldFR5cGUSCwoHVU5LTk9XThAAEhAKDEZFQVRVUkVfRkxBRxABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMK1BMKG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxIRYnVja2V0ZWVyLmFjY291bnQaI3Byb3RvL2Vudmlyb25tZW50L2Vudmlyb25tZW50LnByb3RvGh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvGiRwcm90by9lbnZpcm9ubWVudC9vcmdhbml6YXRpb24ucHJvdG8aIXByb3RvL2FjY291bnQvc2VhcmNoX2ZpbHRlci5wcm90byKrAgoHQWNjb3VudBIOCgJpZBgBIAEoCVICaWQSFAoFZW1haWwYAiABKAlSBWVtYWlsEhIKBG5hbWUYAyABKAlSBG5hbWUSMwoEcm9sZRgEIAEoDjIfLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnQuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgFIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAggASgIUgdkZWxldGVkIjkKBFJvbGUSCgoGVklFV0VSEAASCgoGRURJVE9SEAESCQoFT1dORVIQAhIOCgpVTkFTU0lHTkVEEGM6AhgBIrwICglBY2NvdW50VjISFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSJwoPb3JnYW5pemF0aW9uX2lkGAQgASgJUg5vcmdhbml6YXRpb25JZBJbChFvcmdhbml6YXRpb25fcm9sZRgFIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJZChFlbnZpcm9ubWVudF9yb2xlcxgGIAMoCzIsLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5FbnZpcm9ubWVudFJvbGVSEGVudmlyb25tZW50Um9sZXMSGgoIZGlzYWJsZWQYByABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQSRgoOc2VhcmNoX2ZpbHRlcnMYCiADKAsyHy5idWNrZXRlZXIuYWNjb3VudC5TZWFyY2hGaWx0ZXJSDXNlYXJjaEZpbHRlcnMSHQoKZmlyc3RfbmFtZRgLIAEoCVIJZmlyc3ROYW1lEhsKCWxhc3RfbmFtZRgMIAEoCVIIbGFzdE5hbWUSGgoIbGFuZ3VhZ2UYDSABKAlSCGxhbmd1YWdlEhsKCWxhc3Rfc2VlbhgOIAEoA1IIbGFzdFNlZW4SKAoQYXZhdGFyX2ZpbGVfdHlwZRgPIAEoCVIOYXZhdGFyRmlsZVR5cGUSIQoMYXZhdGFyX2ltYWdlGBAgASgMUgthdmF0YXJJbWFnZRIrChFlbnZpcm9ubWVudF9jb3VudBgRIAEoBVIQZW52aXJvbm1lbnRDb3VudBISCgR0YWdzGBIgAygJUgR0YWdzGtcBCgRSb2xlIlkKC0Vudmlyb25tZW50EhoKFkVudmlyb25tZW50X1VOQVNTSUdORUQQABIWChJFbnZpcm9ubWVudF9WSUVXRVIQARIWChJFbnZpcm9ubWVudF9FRElUT1IQAiJ0CgxPcmdhbml6YXRpb24SGwoXT3JnYW5pemF0aW9uX1VOQVNTSUdORUQQABIXChNPcmdhbml6YXRpb25fTUVNQkVSEAESFgoST3JnYW5pemF0aW9uX0FETUlOEAISFgoST3JnYW5pemF0aW9uX09XTkVSEAMaewoPRW52aXJvbm1lbnRSb2xlEiUKDmVudmlyb25tZW50X2lkGAEgASgJUg1lbnZpcm9ubWVudElkEkEKBHJvbGUYAiABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5FbnZpcm9ubWVudFIEcm9sZSLqBgoOQ29uc29sZUFjY291bnQSFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKYXZhdGFyX3VybBgDIAEoCVIJYXZhdGFyVXJsEiYKD2lzX3N5c3RlbV9hZG1pbhgEIAEoCFINaXNTeXN0ZW1BZG1pbhJHCgxvcmdhbml6YXRpb24YBSABKAsyIy5idWNrZXRlZXIuZW52aXJvbm1lbnQuT3JnYW5pemF0aW9uUgxvcmdhbml6YXRpb24SWwoRb3JnYW5pemF0aW9uX3JvbGUYBiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSXgoRZW52aXJvbm1lbnRfcm9sZXMYByADKAsyMS5idWNrZXRlZXIuYWNjb3VudC5Db25zb2xlQWNjb3VudC5FbnZpcm9ubWVudFJvbGVSEGVudmlyb25tZW50Um9sZXMSRgoOc2VhcmNoX2ZpbHRlcnMYCCADKAsyHy5idWNrZXRlZXIuYWNjb3VudC5TZWFyY2hGaWx0ZXJSDXNlYXJjaEZpbHRlcnMSHQoKZmlyc3RfbmFtZRgJIAEoCVIJZmlyc3ROYW1lEhsKCWxhc3RfbmFtZRgKIAEoCVIIbGFzdE5hbWUSGgoIbGFuZ3VhZ2UYCyABKAlSCGxhbmd1YWdlEigKEGF2YXRhcl9maWxlX3R5cGUYDCABKAlSDmF2YXRhckZpbGVUeXBlEiEKDGF2YXRhcl9pbWFnZRgNIAEoDFILYXZhdGFySW1hZ2USGwoJbGFzdF9zZWVuGA4gASgDUghsYXN0U2VlbhrWAQoPRW52aXJvbm1lbnRSb2xlEkYKC2Vudmlyb25tZW50GAEgASgLMiQuYnVja2V0ZWVyLmVudmlyb25tZW50LkVudmlyb25tZW50VjJSC2Vudmlyb25tZW50EjgKB3Byb2plY3QYAiABKAsyHi5idWNrZXRlZXIuZW52aXJvbm1lbnQuUHJvamVjdFIHcHJvamVjdBJBCgRyb2xlGAMgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGVCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwrmBgobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8iuwMKBkFQSUtleRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIyCgRyb2xlGAMgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHgoKbWFpbnRhaW5lchgHIAEoCVIKbWFpbnRhaW5lchIXCgdhcGlfa2V5GAggASgJUgZhcGlLZXkSIAoLZGVzY3JpcHRpb24YCSABKAlSC2Rlc2NyaXB0aW9uEikKEGVudmlyb25tZW50X25hbWUYCiABKAlSD2Vudmlyb25tZW50TmFtZSJ5CgRSb2xlEgsKB1VOS05PV04QABIOCgpTREtfQ0xJRU5UEAESDgoKU0RLX1NFUlZFUhACEhgKFFBVQkxJQ19BUElfUkVBRF9PTkxZEAMSFAoQUFVCTElDX0FQSV9XUklURRAEEhQKEFBVQkxJQ19BUElfQURNSU4QBSKVAgoRRW52aXJvbm1lbnRBUElLZXkSMgoHYXBpX2tleRgCIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5EjEKFGVudmlyb25tZW50X2Rpc2FibGVkGAMgASgIUhNlbnZpcm9ubWVudERpc2FibGVkEiEKCnByb2plY3RfaWQYBCABKAlCAhgBUglwcm9qZWN0SWQSRgoLZW52aXJvbm1lbnQYBSABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSKAoQcHJvamVjdF91cmxfY29kZRgGIAEoCVIOcHJvamVjdFVybENvZGVKBAgBEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwqcEgobcHJvdG8vYWNjb3VudC9jb21tYW5kLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvGhtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8aIXByb3RvL2FjY291bnQvc2VhcmNoX2ZpbHRlci5wcm90byKQAwoWQ3JlYXRlQWNjb3VudFYyQ29tbWFuZBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBJbChFvcmdhbml6YXRpb25fcm9sZRgEIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJZChFlbnZpcm9ubWVudF9yb2xlcxgFIAMoCzIsLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5FbnZpcm9ubWVudFJvbGVSEGVudmlyb25tZW50Um9sZXMSHQoKZmlyc3RfbmFtZRgGIAEoCVIJZmlyc3ROYW1lEhsKCWxhc3RfbmFtZRgHIAEoCVIIbGFzdE5hbWUSGgoIbGFuZ3VhZ2UYCCABKAlSCGxhbmd1YWdlEhIKBHRhZ3MYCSADKAlSBHRhZ3MiMAoaQ2hhbmdlQWNjb3VudFYyTmFtZUNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZSJACh9DaGFuZ2VBY2NvdW50VjJGaXJzdE5hbWVDb21tYW5kEh0KCmZpcnN0X25hbWUYASABKAlSCWZpcnN0TmFtZSI9Ch5DaGFuZ2VBY2NvdW50VjJMYXN0TmFtZUNvbW1hbmQSGwoJbGFzdF9uYW1lGAEgASgJUghsYXN0TmFtZSI8Ch5DaGFuZ2VBY2NvdW50VjJMYW5ndWFnZUNvbW1hbmQSGgoIbGFuZ3VhZ2UYASABKAlSCGxhbmd1YWdlIlAKJENoYW5nZUFjY291bnRWMkF2YXRhckltYWdlVXJsQ29tbWFuZBIoChBhdmF0YXJfaW1hZ2VfdXJsGAEgASgJUg5hdmF0YXJJbWFnZVVybCJrChxDaGFuZ2VBY2NvdW50VjJBdmF0YXJDb21tYW5kEiEKDGF2YXRhcl9pbWFnZRgBIAEoDFILYXZhdGFySW1hZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgCIAEoCVIOYXZhdGFyRmlsZVR5cGUiMAoaQ2hhbmdlQWNjb3VudFYyVGFnc0NvbW1hbmQSEgoEdGFncxgBIAMoCVIEdGFncyI9Ch5DaGFuZ2VBY2NvdW50VjJMYXN0U2VlbkNvbW1hbmQSGwoJbGFzdF9zZWVuGAEgASgDUghsYXN0U2VlbiJsCiZDaGFuZ2VBY2NvdW50VjJPcmdhbml6YXRpb25Sb2xlQ29tbWFuZBJCCgRyb2xlGAEgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUgRyb2xlIqUCCiZDaGFuZ2VBY2NvdW50VjJFbnZpcm9ubWVudFJvbGVzQ29tbWFuZBJCCgVyb2xlcxgBIAMoCzIsLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5FbnZpcm9ubWVudFJvbGVSBXJvbGVzEmIKCndyaXRlX3R5cGUYAiABKA4yQy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJFbnZpcm9ubWVudFJvbGVzQ29tbWFuZC5Xcml0ZVR5cGVSCXdyaXRlVHlwZSJTCglXcml0ZVR5cGUSGQoVV3JpdGVUeXBlX1VOU1BFQ0lGSUVEEAASFgoSV3JpdGVUeXBlX09WRVJSSURFEAESEwoPV3JpdGVUeXBlX1BBVENIEAIiGAoWRW5hYmxlQWNjb3VudFYyQ29tbWFuZCIZChdEaXNhYmxlQWNjb3VudFYyQ29tbWFuZCIYChZEZWxldGVBY2NvdW50VjJDb21tYW5kIl0KE0NyZWF0ZUFQSUtleUNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZRIyCgRyb2xlGAIgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUiLQoXQ2hhbmdlQVBJS2V5TmFtZUNvbW1hbmQSEgoEbmFtZRgBIAEoCVIEbmFtZSIVChNFbmFibGVBUElLZXlDb21tYW5kIhYKFERpc2FibGVBUElLZXlDb21tYW5kIuYBChlDcmVhdGVTZWFyY2hGaWx0ZXJDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUSFAoFcXVlcnkYAiABKAlSBXF1ZXJ5ElEKEmZpbHRlcl90YXJnZXRfdHlwZRgDIAEoDjIjLmJ1Y2tldGVlci5hY2NvdW50LkZpbHRlclRhcmdldFR5cGVSEGZpbHRlclRhcmdldFR5cGUSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWQSJQoOZGVmYXVsdF9maWx0ZXIYBSABKAhSDWRlZmF1bHRGaWx0ZXIiQwodQ2hhbmdlU2VhcmNoRmlsdGVyTmFtZUNvbW1hbmQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiRgoeQ2hhbmdlU2VhcmNoRmlsdGVyUXVlcnlDb21tYW5kEg4KAmlkGAEgASgJUgJpZBIUCgVxdWVyeRgCIAEoCVIFcXVlcnkiWQogQ2hhbmdlRGVmYXVsdFNlYXJjaEZpbHRlckNvbW1hbmQSDgoCaWQYASABKAlSAmlkEiUKDmRlZmF1bHRfZmlsdGVyGAIgASgIUg1kZWZhdWx0RmlsdGVyIisKGURlbGV0ZVNlYXJjaEZpbHRlckNvbW1hbmQSDgoCaWQYASABKAlSAmlkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hY2NvdW50YgZwcm90bzMKhgQKHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIiMKC0RvdWJsZVZhbHVlEhQKBXZhbHVlGAEgASgBUgV2YWx1ZSIiCgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZSIiCgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZSIjCgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWUiIgoKSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWUiIwoLVUludDMyVmFsdWUSFAoFdmFsdWUYASABKA1SBXZhbHVlIiEKCUJvb2xWYWx1ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWUiIwoLU3RyaW5nVmFsdWUSFAoFdmFsdWUYASABKAlSBXZhbHVlIiIKCkJ5dGVzVmFsdWUSFAoFdmFsdWUYASABKAxSBXZhbHVlQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqHBQoVZ29vZ2xlL2FwaS9odHRwLnByb3RvEgpnb29nbGUuYXBpInkKBEh0dHASKgoFcnVsZXMYASADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgVydWxlcxJFCh9mdWxseV9kZWNvZGVfcmVzZXJ2ZWRfZXhwYW5zaW9uGAIgASgIUhxmdWxseURlY29kZVJlc2VydmVkRXhwYW5zaW9uIrUCCghIdHRwUnVsZRIaCghzZWxlY3RvchgBIAEoCVIIc2VsZWN0b3ISEgoDZ2V0GAIgASgJSABSA2dldBISCgNwdXQYAyABKAlIAFIDcHV0EhQKBHBvc3QYBCABKAlIAFIEcG9zdBIYCgZkZWxldGUYBSABKAlIAFIGZGVsZXRlEhYKBXBhdGNoGAYgASgJSABSBXBhdGNoEjcKBmN1c3RvbRgIIAEoCzIdLmdvb2dsZS5hcGkuQ3VzdG9tSHR0cFBhdHRlcm5IAFIGY3VzdG9tEhIKBGJvZHkYByABKAlSBGJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8zCuFGCiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIk0KEUZpbGVEZXNjcmlwdG9yU2V0EjgKBGZpbGUYASADKAsyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1IEZmlsZSL+BAoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIYCgdlZGl0aW9uGA0gASgJUgdlZGl0aW9uIrkGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUaegoORXh0ZW5zaW9uUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kEkAKB29wdGlvbnMYAyABKAsyJi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zUgdvcHRpb25zGjcKDVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIq0EChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24SWQoLZGVjbGFyYXRpb24YAiADKAsyMi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uQgOIAQJSC2RlY2xhcmF0aW9uEmgKDHZlcmlmaWNhdGlvbhgDIAEoDjI4Lmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGU6ClVOVkVSSUZJRURSDHZlcmlmaWNhdGlvbhqzAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEiMKC2lzX3JlcGVhdGVkGAQgASgIQgIYAVIKaXNSZXBlYXRlZBIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFURUQQAyJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIpEJCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxI3ChRwaHBfZ2VuZXJpY19zZXJ2aWNlcxgqIAEoCDoFZmFsc2VSEnBocEdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECciuwMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKFCQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJKCgZ0YXJnZXQYEiABKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVCAhgBUgZ0YXJnZXQSSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFInMKDE9uZW9mT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpgCCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLQAgoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGusBCgpBbm5vdGF0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEh8KC3NvdXJjZV9maWxlGAIgASgJUgpzb3VyY2VGaWxlEhQKBWJlZ2luGAMgASgFUgViZWdpbhIQCgNlbmQYBCABKAVSA2VuZBJSCghzZW1hbnRpYxgFIAEoDjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLlNlbWFudGljUghzZW1hbnRpYyIoCghTZW1hbnRpYxIICgROT05FEAASBwoDU0VUEAESCQoFQUxJQVMQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCqgCChxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpGhVnb29nbGUvYXBpL2h0dHAucHJvdG8aIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK6AMKH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8SCmdvb2dsZS5hcGkaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvKrYBCg1GaWVsZEJlaGF2aW9yEh4KGkZJRUxEX0JFSEFWSU9SX1VOU1BFQ0lGSUVEEAASDAoIT1BUSU9OQUwQARIMCghSRVFVSVJFRBACEg8KC09VVFBVVF9PTkxZEAMSDgoKSU5QVVRfT05MWRAEEg0KCUlNTVVUQUJMRRAFEhIKDlVOT1JERVJFRF9MSVNUEAYSFQoRTk9OX0VNUFRZX0RFRkFVTFQQBxIOCgpJREVOVElGSUVSEAg6ZAoOZmllbGRfYmVoYXZpb3ISHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJwIIAMoDjIZLmdvb2dsZS5hcGkuRmllbGRCZWhhdmlvckICEABSDWZpZWxkQmVoYXZpb3JCcAoOY29tLmdvb2dsZS5hcGlCEkZpZWxkQmVoYXZpb3JQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwriBQocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIpgBCgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEisgIKBVZhbHVlEjsKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSABSCW51bGxWYWx1ZRIjCgxudW1iZXJfdmFsdWUYAiABKAFIAFILbnVtYmVyVmFsdWUSIwoMc3RyaW5nX3ZhbHVlGAMgASgJSABSC3N0cmluZ1ZhbHVlEh8KCmJvb2xfdmFsdWUYBCABKAhIAFIJYm9vbFZhbHVlEjwKDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAFILc3RydWN0VmFsdWUSOwoKbGlzdF92YWx1ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIAFIJbGlzdFZhbHVlQgYKBGtpbmQiOwoJTGlzdFZhbHVlEi4KBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIGdmFsdWVzKhsKCU51bGxWYWx1ZRIOCgpOVUxMX1ZBTFVFEABCfwoTY29tLmdvb2dsZS5wcm90b2J1ZkILU3RydWN0UHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqmPgoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIrMICgdTd2FnZ2VyEhgKB3N3YWdnZXIYASABKAlSB3N3YWdnZXISQwoEaW5mbxgCIAEoCzIvLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm9SBGluZm8SEgoEaG9zdBgDIAEoCVIEaG9zdBIbCgliYXNlX3BhdGgYBCABKAlSCGJhc2VQYXRoEksKB3NjaGVtZXMYBSADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJfCglyZXNwb25zZXMYCiADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMScQoUc2VjdXJpdHlfZGVmaW5pdGlvbnMYCyABKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zUhNzZWN1cml0eURlZmluaXRpb25zEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSQgoEdGFncxgNIAMoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IEdGFncxJlCg1leHRlcm5hbF9kb2NzGA4gASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSYgoKZXh0ZW5zaW9ucxgPIAMoCzJCLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCUoECAkQCiLWBwoJT3BlcmF0aW9uEhIKBHRhZ3MYASADKAlSBHRhZ3MSGAoHc3VtbWFyeRgCIAEoCVIHc3VtbWFyeRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgEIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEiEKDG9wZXJhdGlvbl9pZBgFIAEoCVILb3BlcmF0aW9uSWQSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJhCglyZXNwb25zZXMYCSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJLCgdzY2hlbWVzGAogAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEh4KCmRlcHJlY2F0ZWQYCyABKAhSCmRlcHJlY2F0ZWQSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJkCgpleHRlbnNpb25zGA0gAygLMkQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxJVCgpwYXJhbWV0ZXJzGA4gASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUGFyYW1ldGVyc1IKcGFyYW1ldGVycxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAkiYgoKUGFyYW1ldGVycxJUCgdoZWFkZXJzGAEgAygLMjouZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyUgdoZWFkZXJzIqMCCg9IZWFkZXJQYXJhbWV0ZXISEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SUwoEdHlwZRgDIAEoDjI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlci5UeXBlUgR0eXBlEhYKBmZvcm1hdBgEIAEoCVIGZm9ybWF0EhoKCHJlcXVpcmVkGAUgASgIUghyZXF1aXJlZCJFCgRUeXBlEgsKB1VOS05PV04QABIKCgZTVFJJTkcQARIKCgZOVU1CRVIQAhILCgdJTlRFR0VSEAMSCwoHQk9PTEVBThAESgQIBhAHSgQIBxAIItgBCgZIZWFkZXISIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhIKBHR5cGUYAiABKAlSBHR5cGUSFgoGZm9ybWF0GAMgASgJUgZmb3JtYXQSGAoHZGVmYXVsdBgGIAEoCVIHZGVmYXVsdBIYCgdwYXR0ZXJuGA0gASgJUgdwYXR0ZXJuSgQIBBAFSgQIBRAGSgQIBxAISgQICBAJSgQICRAKSgQIChALSgQICxAMSgQIDBANSgQIDhAPSgQIDxAQSgQIEBARSgQIERASSgQIEhATIpoFCghSZXNwb25zZRIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SSQoGc2NoZW1hGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUgZzY2hlbWESWgoHaGVhZGVycxgDIAMoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxJdCghleGFtcGxlcxgEIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4YW1wbGVzRW50cnlSCGV4YW1wbGVzEmMKCmV4dGVuc2lvbnMYBSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMabQoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkcKBXZhbHVlGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUgV2YWx1ZToCOAEaOwoNRXhhbXBsZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBItYDCgRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SKAoQdGVybXNfb2Zfc2VydmljZRgDIAEoCVIOdGVybXNPZlNlcnZpY2USTAoHY29udGFjdBgEIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkNvbnRhY3RSB2NvbnRhY3QSTAoHbGljZW5zZRgFIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkxpY2Vuc2VSB2xpY2Vuc2USGAoHdmVyc2lvbhgGIAEoCVIHdmVyc2lvbhJfCgpleHRlbnNpb25zGAcgAygLMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mby5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiRQoHQ29udGFjdBISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsEhQKBWVtYWlsGAMgASgJUgVlbWFpbCIvCgdMaWNlbnNlEhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwiSwoVRXh0ZXJuYWxEb2N1bWVudGF0aW9uEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhIQCgN1cmwYAiABKAlSA3VybCKqAgoGU2NoZW1hElYKC2pzb25fc2NoZW1hGAEgASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIKanNvblNjaGVtYRIkCg1kaXNjcmltaW5hdG9yGAIgASgJUg1kaXNjcmltaW5hdG9yEhsKCXJlYWRfb25seRgDIAEoCFIIcmVhZE9ubHkSZQoNZXh0ZXJuYWxfZG9jcxgFIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEhgKB2V4YW1wbGUYBiABKAlSB2V4YW1wbGVKBAgEEAUi1woKCkpTT05TY2hlbWESEAoDcmVmGAMgASgJUgNyZWYSFAoFdGl0bGUYBSABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAYgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWZhdWx0GAcgASgJUgdkZWZhdWx0EhsKCXJlYWRfb25seRgIIAEoCFIIcmVhZE9ubHkSGAoHZXhhbXBsZRgJIAEoCVIHZXhhbXBsZRIfCgttdWx0aXBsZV9vZhgKIAEoAVIKbXVsdGlwbGVPZhIYCgdtYXhpbXVtGAsgASgBUgdtYXhpbXVtEisKEWV4Y2x1c2l2ZV9tYXhpbXVtGAwgASgIUhBleGNsdXNpdmVNYXhpbXVtEhgKB21pbmltdW0YDSABKAFSB21pbmltdW0SKwoRZXhjbHVzaXZlX21pbmltdW0YDiABKAhSEGV4Y2x1c2l2ZU1pbmltdW0SHQoKbWF4X2xlbmd0aBgPIAEoBFIJbWF4TGVuZ3RoEh0KCm1pbl9sZW5ndGgYECABKARSCW1pbkxlbmd0aBIYCgdwYXR0ZXJuGBEgASgJUgdwYXR0ZXJuEhsKCW1heF9pdGVtcxgUIAEoBFIIbWF4SXRlbXMSGwoJbWluX2l0ZW1zGBUgASgEUghtaW5JdGVtcxIhCgx1bmlxdWVfaXRlbXMYFiABKAhSC3VuaXF1ZUl0ZW1zEiUKDm1heF9wcm9wZXJ0aWVzGBggASgEUg1tYXhQcm9wZXJ0aWVzEiUKDm1pbl9wcm9wZXJ0aWVzGBkgASgEUg1taW5Qcm9wZXJ0aWVzEhoKCHJlcXVpcmVkGBogAygJUghyZXF1aXJlZBIUCgVhcnJheRgiIAMoCVIFYXJyYXkSXwoEdHlwZRgjIAMoDjJLLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuSlNPTlNjaGVtYVNpbXBsZVR5cGVzUgR0eXBlEhYKBmZvcm1hdBgkIAEoCVIGZm9ybWF0EhIKBGVudW0YLiADKAlSBGVudW0SegoTZmllbGRfY29uZmlndXJhdGlvbhjpByABKAsySC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkZpZWxkQ29uZmlndXJhdGlvblISZmllbGRDb25maWd1cmF0aW9uEmUKCmV4dGVuc2lvbnMYMCADKAsyRS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxo8ChJGaWVsZENvbmZpZ3VyYXRpb24SJgoPcGF0aF9wYXJhbV9uYW1lGC8gASgJUg1wYXRoUGFyYW1OYW1lGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIncKFUpTT05TY2hlbWFTaW1wbGVUeXBlcxILCgdVTktOT1dOEAASCQoFQVJSQVkQARILCgdCT09MRUFOEAISCwoHSU5URUdFUhADEggKBE5VTEwQBBIKCgZOVU1CRVIQBRIKCgZPQkpFQ1QQBhIKCgZTVFJJTkcQB0oECAEQAkoECAIQA0oECAQQBUoECBIQE0oECBMQFEoECBcQGEoECBsQHEoECBwQHUoECB0QHkoECB4QIkoECCUQKkoECCoQK0oECCsQLiLZAgoDVGFnEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYAyABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJeCgpleHRlbnNpb25zGAQgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASL3AQoTU2VjdXJpdHlEZWZpbml0aW9ucxJoCghzZWN1cml0eRgBIAMoCzJMLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnMuU2VjdXJpdHlFbnRyeVIIc2VjdXJpdHkadgoNU2VjdXJpdHlFbnRyeRIQCgNrZXkYASABKAlSA2tleRJPCgV2YWx1ZRgCIAEoCzI5LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lUgV2YWx1ZToCOAEi/wYKDlNlY3VyaXR5U2NoZW1lElIKBHR5cGUYASABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5UeXBlUgR0eXBlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhISCgRuYW1lGAMgASgJUgRuYW1lEkwKAmluGAQgASgOMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuSW5SAmluElIKBGZsb3cYBSABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5GbG93UgRmbG93EisKEWF1dGhvcml6YXRpb25fdXJsGAYgASgJUhBhdXRob3JpemF0aW9uVXJsEhsKCXRva2VuX3VybBgHIAEoCVIIdG9rZW5VcmwSSQoGc2NvcGVzGAggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzUgZzY29wZXMSaQoKZXh0ZW5zaW9ucxgJIAMoCzJJLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJLCgRUeXBlEhAKDFRZUEVfSU5WQUxJRBAAEg4KClRZUEVfQkFTSUMQARIQCgxUWVBFX0FQSV9LRVkQAhIPCgtUWVBFX09BVVRIMhADIjEKAkluEg4KCklOX0lOVkFMSUQQABIMCghJTl9RVUVSWRABEg0KCUlOX0hFQURFUhACImoKBEZsb3cSEAoMRkxPV19JTlZBTElEEAASEQoNRkxPV19JTVBMSUNJVBABEhEKDUZMT1dfUEFTU1dPUkQQAhIUChBGTE9XX0FQUExJQ0FUSU9OEAMSFAoQRkxPV19BQ0NFU1NfQ09ERRAEIvYCChNTZWN1cml0eVJlcXVpcmVtZW50EooBChRzZWN1cml0eV9yZXF1aXJlbWVudBgBIAMoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5UhNzZWN1cml0eVJlcXVpcmVtZW50GjAKGFNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZRIUCgVzY29wZRgBIAMoCVIFc2NvcGUanwEKGFNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRJtCgV2YWx1ZRgCIAEoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlUgV2YWx1ZToCOAEilgEKBlNjb3BlcxJSCgVzY29wZRgBIAMoCzI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blcy5TY29wZUVudHJ5UgVzY29wZRo4CgpTY29wZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEqOwoGU2NoZW1lEgsKB1VOS05PV04QABIICgRIVFRQEAESCQoFSFRUUFMQAhIGCgJXUxADEgcKA1dTUxAEQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr9BgoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvGixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bzp+ChFvcGVuYXBpdjJfc3dhZ2dlchIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiSCCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyUhBvcGVuYXBpdjJTd2FnZ2VyOoYBChNvcGVuYXBpdjJfb3BlcmF0aW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYkgggASgLMjQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uUhJvcGVuYXBpdjJPcGVyYXRpb246fgoQb3BlbmFwaXYyX3NjaGVtYRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiSCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSD29wZW5hcGl2MlNjaGVtYTp1Cg1vcGVuYXBpdjJfdGFnEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJIIIAEoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IMb3BlbmFwaXYyVGFnOn4KD29wZW5hcGl2Ml9maWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkgggASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIOb3BlbmFwaXYyRmllbGRCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCta/AQobcHJvdG8vYWNjb3VudC9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvGh9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvGi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxobcHJvdG8vYWNjb3VudC9jb21tYW5kLnByb3RvGiRwcm90by9lbnZpcm9ubWVudC9vcmdhbml6YXRpb24ucHJvdG8iNwoMR2V0TWVSZXF1ZXN0EicKD29yZ2FuaXphdGlvbl9pZBgBIAEoCVIOb3JnYW5pemF0aW9uSWQiTAoNR2V0TWVSZXNwb25zZRI7CgdhY2NvdW50GAEgASgLMiEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnRSB2FjY291bnQiGwoZR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdCI4CiBHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiZwoaR2V0TXlPcmdhbml6YXRpb25zUmVzcG9uc2USSQoNb3JnYW5pemF0aW9ucxgBIAMoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDW9yZ2FuaXphdGlvbnMiggQKFkNyZWF0ZUFjY291bnRWMlJlcXVlc3QSJwoPb3JnYW5pemF0aW9uX2lkGAEgASgJUg5vcmdhbml6YXRpb25JZBJHCgdjb21tYW5kGAIgASgLMikuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQSFAoFZW1haWwYAyABKAlSBWVtYWlsEhIKBG5hbWUYBCABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgFIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYByADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEh0KCmZpcnN0X25hbWUYCCABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCSABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAogASgJUghsYW5ndWFnZRISCgR0YWdzGAsgAygJUgR0YWdzIlEKF0NyZWF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkVuYWJsZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIlEKF0VuYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiogEKF0Rpc2FibGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEkgKB2NvbW1hbmQYAyABKAsyKi5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyQ29tbWFuZEICGAFSB2NvbW1hbmQiUgoYRGlzYWJsZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQioAEKFkRlbGV0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSRwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMkNvbW1hbmRCAhgBUgdjb21tYW5kIhkKF0RlbGV0ZUFjY291bnRWMlJlc3BvbnNlIt0QChZVcGRhdGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEmEKE2NoYW5nZV9uYW1lX2NvbW1hbmQYAyABKAsyLS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJOYW1lQ29tbWFuZEICGAFSEWNoYW5nZU5hbWVDb21tYW5kEnYKGWNoYW5nZV9hdmF0YXJfdXJsX2NvbW1hbmQYBCABKAsyNy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJJbWFnZVVybENvbW1hbmRCAhgBUhZjaGFuZ2VBdmF0YXJVcmxDb21tYW5kEoYBCiBjaGFuZ2Vfb3JnYW5pemF0aW9uX3JvbGVfY29tbWFuZBgFIAEoCzI5LmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMk9yZ2FuaXphdGlvblJvbGVDb21tYW5kQgIYAVIdY2hhbmdlT3JnYW5pemF0aW9uUm9sZUNvbW1hbmQShgEKIGNoYW5nZV9lbnZpcm9ubWVudF9yb2xlc19jb21tYW5kGAYgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NvbW1hbmRCAhgBUh1jaGFuZ2VFbnZpcm9ubWVudFJvbGVzQ29tbWFuZBJxChljaGFuZ2VfZmlyc3RfbmFtZV9jb21tYW5kGAcgASgLMjIuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyRmlyc3ROYW1lQ29tbWFuZEICGAFSFmNoYW5nZUZpcnN0TmFtZUNvbW1hbmQSbgoYY2hhbmdlX2xhc3RfbmFtZV9jb21tYW5kGAggASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFzdE5hbWVDb21tYW5kQgIYAVIVY2hhbmdlTGFzdE5hbWVDb21tYW5kEm0KF2NoYW5nZV9sYW5ndWFnZV9jb21tYW5kGAkgASgLMjEuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyTGFuZ3VhZ2VDb21tYW5kQgIYAVIVY2hhbmdlTGFuZ3VhZ2VDb21tYW5kEm4KGGNoYW5nZV9sYXN0X3NlZW5fY29tbWFuZBgKIAEoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMkxhc3RTZWVuQ29tbWFuZEICGAFSFWNoYW5nZUxhc3RTZWVuQ29tbWFuZBJnChVjaGFuZ2VfYXZhdGFyX2NvbW1hbmQYCyABKAsyLy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJBdmF0YXJDb21tYW5kQgIYAVITY2hhbmdlQXZhdGFyQ29tbWFuZBIwCgRuYW1lGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEkYKEGF2YXRhcl9pbWFnZV91cmwYDSABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSDmF2YXRhckltYWdlVXJsEmwKEW9yZ2FuaXphdGlvbl9yb2xlGA4gASgLMj8uYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5Pcmdhbml6YXRpb25Sb2xlVmFsdWVSEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYDyADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEjsKCmZpcnN0X25hbWUYECABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCWZpcnN0TmFtZRI5CglsYXN0X25hbWUYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVSCGxhc3ROYW1lEjgKCGxhbmd1YWdlGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUghsYW5ndWFnZRI4CglsYXN0X3NlZW4YEyABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVIIbGFzdFNlZW4SUQoGYXZhdGFyGBQgASgLMjkuYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVxdWVzdC5BY2NvdW50VjJBdmF0YXJSBmF2YXRhchI2CghkaXNhYmxlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkEhIKBHRhZ3MYFiADKAlSBHRhZ3MSYQoTY2hhbmdlX3RhZ3NfY29tbWFuZBgXIAEoCzItLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMlRhZ3NDb21tYW5kQgIYAVIRY2hhbmdlVGFnc0NvbW1hbmQaXgoPQWNjb3VudFYyQXZhdGFyEiEKDGF2YXRhcl9pbWFnZRgBIAEoDFILYXZhdGFySW1hZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgCIAEoCVIOYXZhdGFyRmlsZVR5cGUaWwoVT3JnYW5pemF0aW9uUm9sZVZhbHVlEkIKBHJvbGUYASABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SBHJvbGUiUQoXVXBkYXRlQWNjb3VudFYyUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCJUChNHZXRBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkIk4KFEdldEFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiYQoiR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiXQojR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2USNgoHYWNjb3VudBgBIAEoCzIcLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMlIHYWNjb3VudCKpBgoVTGlzdEFjY291bnRzVjJSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISJwoPb3JnYW5pemF0aW9uX2lkGAMgASgJUg5vcmdhbml6YXRpb25JZBJLCghvcmRlcl9ieRgEIAEoDjIwLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmAKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI3LmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZBJIChFvcmdhbml6YXRpb25fcm9sZRgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhBvcmdhbml6YXRpb25Sb2xlEkMKDmVudmlyb25tZW50X2lkGAkgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUg1lbnZpcm9ubWVudElkEkYKEGVudmlyb25tZW50X3JvbGUYCiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIPZW52aXJvbm1lbnRSb2xlEhIKBHRhZ3MYCyADKAlSBHRhZ3MikwEKB09yZGVyQnkSCwoHREVGQVVMVBAAEgkKBUVNQUlMEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIVChFPUkdBTklaQVRJT05fUk9MRRAEEhUKEUVOVklST05NRU5UX0NPVU5UEAUSDQoJTEFTVF9TRUVOEAYSCQoFU1RBVEUQBxIICgRUQUdTEAgiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABIosBChZMaXN0QWNjb3VudHNWMlJlc3BvbnNlEjgKCGFjY291bnRzGAEgAygLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUghhY2NvdW50cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKSAgoTQ3JlYXRlQVBJS2V5UmVxdWVzdBJECgdjb21tYW5kGAEgASgLMiYuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQVBJS2V5Q29tbWFuZEICGAFSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYAyABKAlSDWVudmlyb25tZW50SWQSEgoEbmFtZRgEIAEoCVIEbmFtZRIyCgRyb2xlGAUgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSHgoKbWFpbnRhaW5lchgGIAEoCVIKbWFpbnRhaW5lchIgCgtkZXNjcmlwdGlvbhgHIAEoCVILZGVzY3JpcHRpb25KBAgCEAMiSgoUQ3JlYXRlQVBJS2V5UmVzcG9uc2USMgoHYXBpX2tleRgBIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5IpwBChdDaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSRAoHY29tbWFuZBgCIAEoCzIqLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVDb21tYW5kUgdjb21tYW5kEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIhoKGENoYW5nZUFQSUtleU5hbWVSZXNwb25zZSKUAQoTRW5hYmxlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQAoHY29tbWFuZBgCIAEoCzImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFgoURW5hYmxlQVBJS2V5UmVzcG9uc2UilgEKFERpc2FibGVBUElLZXlSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBJBCgdjb21tYW5kGAIgASgLMicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiFwoVRGlzYWJsZUFQSUtleVJlc3BvbnNlIk8KEEdldEFQSUtleVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkSgQIAhADIkcKEUdldEFQSUtleVJlc3BvbnNlEjIKB2FwaV9rZXkYASABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleSLmBAoSTGlzdEFQSUtleXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISSAoIb3JkZXJfYnkYBCABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJdCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSKQoOZW52aXJvbm1lbnRfaWQYCCABKAlCAhgBUg1lbnZpcm9ubWVudElkEicKD2Vudmlyb25tZW50X2lkcxgJIAMoCVIOZW52aXJvbm1lbnRJZHMSLAoPb3JnYW5pemF0aW9uX2lkGAogASgJQgPgQQJSDm9yZ2FuaXphdGlvbklkImYKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEggKBFJPTEUQBBIPCgtFTlZJUk9OTUVOVBAFEgkKBVNUQVRFEAYiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIAxAEIoQBChNMaXN0QVBJS2V5c1Jlc3BvbnNlEjQKCGFwaV9rZXlzGAEgAygLMhkuYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5UgdhcGlLZXlzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IjYKG0dldEVudmlyb25tZW50QVBJS2V5UmVxdWVzdBIXCgdhcGlfa2V5GAIgASgJUgZhcGlLZXkidAocR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZRJUChNlbnZpcm9ubWVudF9hcGlfa2V5GAEgASgLMiQuYnVja2V0ZWVyLmFjY291bnQuRW52aXJvbm1lbnRBUElLZXlSEWVudmlyb25tZW50QXBpS2V5IskBChlDcmVhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEkYKB2NvbW1hbmQYBCABKAsyLC5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJDb21tYW5kUgdjb21tYW5kIhwKGkNyZWF0ZVNlYXJjaEZpbHRlclJlc3BvbnNlIsADChlVcGRhdGVTZWFyY2hGaWx0ZXJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEiUKDmVudmlyb25tZW50X2lkGAMgASgJUg1lbnZpcm9ubWVudElkEmAKE2NoYW5nZV9uYW1lX2NvbW1hbmQYBCABKAsyMC5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJOYW1lQ29tbWFuZFIRY2hhbmdlTmFtZUNvbW1hbmQSYwoUY2hhbmdlX3F1ZXJ5X2NvbW1hbmQYBSABKAsyMS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VTZWFyY2hGaWx0ZXJRdWVyeUNvbW1hbmRSEmNoYW5nZVF1ZXJ5Q29tbWFuZBJ2Ch1jaGFuZ2VfZGVmYXVsdF9maWx0ZXJfY29tbWFuZBgGIAEoCzIzLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZURlZmF1bHRTZWFyY2hGaWx0ZXJDb21tYW5kUhpjaGFuZ2VEZWZhdWx0RmlsdGVyQ29tbWFuZCIcChpVcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLJAQoZRGVsZXRlU2VhcmNoRmlsdGVyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZBIlCg5lbnZpcm9ubWVudF9pZBgDIAEoCVINZW52aXJvbm1lbnRJZBJGCgdjb21tYW5kGAQgASgLMiwuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlU2VhcmNoRmlsdGVyQ29tbWFuZFIHY29tbWFuZCIcChpEZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLoAgoTVXBkYXRlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQSMAoEbmFtZRgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb24SMgoEcm9sZRgFIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEjYKCGRpc2FibGVkGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSPAoKbWFpbnRhaW5lchgHIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIKbWFpbnRhaW5lciIWChRVcGRhdGVBUElLZXlSZXNwb25zZTLOegoOQWNjb3VudFNlcnZpY2USngQKBUdldE1lEh8uYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXF1ZXN0GiAuYnVja2V0ZWVyLmFjY291bnQuR2V0TWVSZXNwb25zZSLRA5JBswMKB0FjY291bnQSBkdldCBNZRodR2V0IHRoZSB1c2VyIGNvbnNvbGUgYWNjb3VudC4qFXdlYi52MS5hY2NvdW50LmdldF9tZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhQSEi92MS9hY2NvdW50L2dldF9tZRL4BAoSR2V0TXlPcmdhbml6YXRpb25zEiwuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdBotLmJ1Y2tldGVlci5hY2NvdW50LkdldE15T3JnYW5pemF0aW9uc1Jlc3BvbnNlIoQEkkHcAwoHQWNjb3VudBIUR2V0IE15IE9yZ2FuaXphdGlvbnMaLkdldCBhbGwgdGhlIG9yZ2FuaXphdGlvbnMgZm9yIGEgc3BlY2lmaWMgdXNlci4qH3dlYi52MS5hY2NvdW50Lm15X29yZ2FuaXphdGlvbnNKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIeEhwvdjEvYWNjb3VudC9teV9vcmdhbml6YXRpb25zEpYFChlHZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsEjMuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zQnlFbWFpbFJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5HZXRNeU9yZ2FuaXphdGlvbnNSZXNwb25zZSKUBJJB4wMKB0FjY291bnQSHUdldCBNeSBPcmdhbml6YXRpb25zIEJ5IEVtYWlsGiNHZXQgYWxsIHRoZSBvcmdhbml6YXRpb25zIGJ5IGVtYWlsLiood2ViLnYxLmFjY291bnQubXlfb3JnYW5pemF0aW9uc19ieV9lbWFpbEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAicSJS92MS9hY2NvdW50L215X29yZ2FuaXphdGlvbnNfYnlfZW1haWwSugYKD0NyZWF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBY2NvdW50VjJSZXNwb25zZSLPBZJBpgUKB0FjY291bnQSBkNyZWF0ZRpcQ3JlYXRlIGFuIGFjY291bnQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbnNvbGUuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmNyZWF0ZV9hY2NvdW50SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2NyZWF0ZV9hY2NvdW50OgEqEs4DCg9FbmFibGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuRW5hYmxlQWNjb3VudFYyUmVzcG9uc2Ui4wKSQboCCgdBY2NvdW50EgZFbmFibGUaXEVuYWJsZSBhbiBhY2NvdW50IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC5lbmFibGVfYWNjb3VudEqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hY2NvdW50OgEqEsIGChBEaXNhYmxlQWNjb3VudFYyEiouYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFjY291bnRWMlJlcXVlc3QaKy5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyUmVzcG9uc2Ui1AWSQaoFCgdBY2NvdW50EgdEaXNhYmxlGl5EaXNhYmxlIGFuIGFjY291bnQgdG8gYmxvY2sgYWNjZXNzIHRvIHRoZSBjb25zb2xlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh53ZWIudjEuYWNjb3VudC5kaXNhYmxlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCICIbL3YxL2FjY291bnQvZGlzYWJsZV9hY2NvdW50OgEqEpwGCg9VcGRhdGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuVXBkYXRlQWNjb3VudFYyUmVzcG9uc2UisQWSQYgFCgdBY2NvdW50EgZVcGRhdGUaPlVwZGF0ZSBhbiBhY2NvdW50LiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKh13ZWIudjEuYWNjb3VudC51cGRhdGVfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIfIhovdjEvYWNjb3VudC91cGRhdGVfYWNjb3VudDoBKhKcBgoPRGVsZXRlQWNjb3VudFYyEikuYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlQWNjb3VudFYyUmVxdWVzdBoqLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMlJlc3BvbnNlIrEFkkGIBQoHQWNjb3VudBIGRGVsZXRlGj5EZWxldGUgYW4gYWNjb3VudC4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuZGVsZXRlX2FjY291bnRKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvZGVsZXRlX2FjY291bnQ6ASoSrAQKDEdldEFjY291bnRWMhImLmJ1Y2tldGVlci5hY2NvdW50LkdldEFjY291bnRWMlJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJSZXNwb25zZSLKA5JBpwMKB0FjY291bnQSA0dldBoPR2V0IGFuIGFjY291bnQuKhp3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hY2NvdW50Ep0FChtHZXRBY2NvdW50VjJCeUVudmlyb25tZW50SUQSNS5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJCeUVudmlyb25tZW50SURSZXF1ZXN0GjYuYnVja2V0ZWVyLmFjY291bnQuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2UijgSSQdwDCgdBY2NvdW50EhpHZXQgQWNjb3VudCBCeSBFbnZpcm9ubWVudBoeR2V0IGFuIGFjY291bnQgYnkgZW52aXJvbm1lbnQuKil3ZWIudjEuYWNjb3VudC5nZXRfYWNjb3VudF9ieV9lbnZpcm9ubWVudEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAigSJi92MS9hY2NvdW50L2dldF9hY2NvdW50X2J5X2Vudmlyb25tZW50ErYECg5MaXN0QWNjb3VudHNWMhIoLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVxdWVzdBopLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBY2NvdW50c1YyUmVzcG9uc2UizgOSQakDCgdBY2NvdW50EgRMaXN0Gg5MaXN0IGFjY291bnRzLiocd2ViLnYxLmFjY291bnQubGlzdF9hY2NvdW50c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYWNjb3VudHMSsAYKDENyZWF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBUElLZXlSZXNwb25zZSLOBZJBpQUKB0FQSSBLZXkSBkNyZWF0ZRpbQ3JlYXRlIGFuIEFQSSBrZXkgdG8gYmUgdXNlZCBvbiB0aGUgY2xpZW50IFNESy4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQuY3JlYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHyIaL3YxL2FjY291bnQvY3JlYXRlX2FwaV9rZXk6ASoSvAYKEENoYW5nZUFQSUtleU5hbWUSKi5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBUElLZXlOYW1lUmVxdWVzdBorLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFQSUtleU5hbWVSZXNwb25zZSLOBZJBoAUKB0FQSSBLZXkSE0NoYW5nZSBBUEkgS2V5IE5hbWUaRENoYW5nZSB0aGUgQVBJIEtleSBOYW1lLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgQURNSU5gIHJvbGUuKiJ3ZWIudjEuYWNjb3VudC5jaGFuZ2VfYXBpX2tleV9uYW1lSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAiQiHy92MS9hY2NvdW50L2NoYW5nZV9hcGlfa2V5X25hbWU6ASoSkwYKDEVuYWJsZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBUElLZXlSZXNwb25zZSKxBZJBiAUKB0FQSSBLZXkSBkVuYWJsZRo+RW5hYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHXdlYi52MS5hY2NvdW50LmVuYWJsZV9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAh8iGi92MS9hY2NvdW50L2VuYWJsZV9hcGlfa2V5OgEqEpoGCg1EaXNhYmxlQVBJS2V5EicuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFQSUtleVJlcXVlc3QaKC5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQVBJS2V5UmVzcG9uc2UitQWSQYsFCgdBUEkgS2V5EgdEaXNhYmxlGj9EaXNhYmxlIGFuIEFQSSBLZXkuIFRvIGNhbGwgdGhpcyBBUEksIHlvdSBuZWVkIGFuIGBBRE1JTmAgcm9sZS4qHndlYi52MS5hY2NvdW50LmRpc2FibGVfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIgIhsvdjEvYWNjb3VudC9kaXNhYmxlX2FwaV9rZXk6ASoSowQKCUdldEFQSUtleRIjLmJ1Y2tldGVlci5hY2NvdW50LkdldEFQSUtleVJlcXVlc3QaJC5idWNrZXRlZXIuYWNjb3VudC5HZXRBUElLZXlSZXNwb25zZSLKA5JBpwMKB0FQSSBLZXkSA0dldBoPR2V0IGFuIEFQSSBLZXkuKhp3ZWIudjEuYWNjb3VudC5nZXRfYXBpX2tleUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhkSFy92MS9hY2NvdW50L2dldF9hcGlfa2V5Eq0ECgtMaXN0QVBJS2V5cxIlLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVxdWVzdBomLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVzcG9uc2UizgOSQakDCgdBUEkgS2V5EgRMaXN0Gg5MaXN0IEFQSSBLZXlzLiocd2ViLnYxLmFjY291bnQubGlzdF9hcGlfa2V5c0q0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsSGS92MS9hY2NvdW50L2xpc3RfYXBpX2tleXMS/AQKFEdldEVudmlyb25tZW50QVBJS2V5Ei4uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXF1ZXN0Gi8uYnVja2V0ZWVyLmFjY291bnQuR2V0RW52aXJvbm1lbnRBUElLZXlSZXNwb25zZSKCBJJB0wMKB0FQSSBLZXkSF0dldCBFbnZpcm9ubWVudCBBUEkgS2V5GhtHZXQgYW4gZW52aXJvbm1lbnQgQVBJIEtleS4qJndlYi52MS5hY2NvdW50LmdldF9lbnZpcm9ubWVudF9hcGlfa2V5SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJRIjL3YxL2FjY291bnQvZ2V0X2Vudmlyb25tZW50X2FwaV9rZXkSxQYKEkNyZWF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFENyZWF0ZSBTZWFyY2ggRmlsdGVyGkRDcmVhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuY3JlYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvY3JlYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKElVwZGF0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFFVwZGF0ZSBTZWFyY2ggRmlsdGVyGkRVcGRhdGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQudXBkYXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvdXBkYXRlX3NlYXJjaF9maWx0ZXI6ASoSxQYKEkRlbGV0ZVNlYXJjaEZpbHRlchIsLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZVNlYXJjaEZpbHRlclJlcXVlc3QaLS5idWNrZXRlZXIuYWNjb3VudC5EZWxldGVTZWFyY2hGaWx0ZXJSZXNwb25zZSLRBZJBogUKB0FjY291bnQSFERlbGV0ZSBTZWFyY2ggRmlsdGVyGkREZWxldGUgYSBzZWFyY2ggZmlsdGVyLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhbiBgVklFV0VSYCByb2xlLiojd2ViLnYxLmFjY291bnQuZGVsZXRlX3NlYXJjaF9maWx0ZXJKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCJSIgL3YxL2FjY291bnQvZGVsZXRlX3NlYXJjaF9maWx0ZXI6ASoSmwYKDFVwZGF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBUElLZXlSZXNwb25zZSK5BZJBkAUKB0FQSSBLZXkSDlVwZGF0ZSBBUEkgS2V5Gj5VcGRhdGUgYW4gQVBJIEtleS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYW4gYEFETUlOYCByb2xlLiodd2ViLnYxLmFjY291bnQudXBkYXRlX2FwaV9rZXlKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHzIaL3YxL2FjY291bnQvdXBkYXRlX2FwaV9rZXk6ASpCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMw==
experimentcalculatorDescriptor: CtYBCh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiZwoJVmFyaWF0aW9uEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUSEgoEbmFtZRgDIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq8BwohcHJvdG8vZXhwZXJpbWVudC9leHBlcmltZW50LnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudBodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8i0AUKCkV4cGVyaW1lbnQSDgoCaWQYASABKAlSAmlkEhsKB2dvYWxfaWQYAiABKAlCAhgBUgZnb2FsSWQSHQoKZmVhdHVyZV9pZBgDIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgEIAEoBVIOZmVhdHVyZVZlcnNpb24SPAoKdmFyaWF0aW9ucxgFIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSHAoHc3RvcHBlZBgIIAEoCEICGAFSB3N0b3BwZWQSIQoKc3RvcHBlZF9hdBgJIAEoA0ICMAFSCXN0b3BwZWRBdBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYDCABKAhSB2RlbGV0ZWQSGQoIZ29hbF9pZHMYDSADKAlSB2dvYWxJZHMSEgoEbmFtZRgOIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgPIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYECABKAlSD2Jhc2VWYXJpYXRpb25JZBI/CgZzdGF0dXMYEiABKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IGc3RhdHVzEh4KCm1haW50YWluZXIYEyABKAlSCm1haW50YWluZXISGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkIkIKBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgsKB1NUT1BQRUQQAhIRCg1GT1JDRV9TVE9QUEVEEANKBAgREBIiUQoLRXhwZXJpbWVudHMSQgoLZXhwZXJpbWVudHMYASADKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgtleHBlcmltZW50c0I0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8zCuADCihwcm90by9leHBlcmltZW50Y2FsY3VsYXRvci9zZXJ2aWNlLnByb3RvEh5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IaIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90byJ7ChBCYXRjaENhbGNSZXF1ZXN0EiUKDmVudmlyb25tZW50X2lkGAEgASgJUg1lbnZpcm9ubWVudElkEkAKCmV4cGVyaW1lbnQYAiABKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgpleHBlcmltZW50IhMKEUJhdGNoQ2FsY1Jlc3BvbnNlMpYBChtFeHBlcmltZW50Q2FsY3VsYXRvclNlcnZpY2USdwoOQ2FsY0V4cGVyaW1lbnQSMC5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IuQmF0Y2hDYWxjUmVxdWVzdBoxLmJ1Y2tldGVlci5leHBlcmltZW50Y2FsY3VsYXRvci5CYXRjaENhbGNSZXNwb25zZSIAQj5aPGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9leHBlcmltZW50Y2FsY3VsYXRvcmIGcHJvdG8z
- auditlogDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKxwMKGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSLaAgoGQ2xhdXNlEg4KAmlkGAEgASgJUgJpZBIcCglhdHRyaWJ1dGUYAiABKAlSCWF0dHJpYnV0ZRI+CghvcGVyYXRvchgDIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3ISFgoGdmFsdWVzGAQgAygJUgZ2YWx1ZXMiyQEKCE9wZXJhdG9yEgoKBkVRVUFMUxAAEgYKAklOEAESDQoJRU5EU19XSVRIEAISDwoLU1RBUlRTX1dJVEgQAxILCgdTRUdNRU5UEAQSCwoHR1JFQVRFUhAFEhQKEEdSRUFURVJfT1JfRVFVQUwQBhIICgRMRVNTEAcSEQoNTEVTU19PUl9FUVVBTBAIEgoKBkJFRk9SRRAJEgkKBUFGVEVSEAoSEAoMRkVBVFVSRV9GTEFHEAsSEwoPUEFSVElBTExZX01BVENIEAxCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq7BAoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiLQoNRml4ZWRTdHJhdGVneRIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbiKiAQoPUm9sbG91dFN0cmF0ZWd5EkwKCnZhcmlhdGlvbnMYASADKAsyLC5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3kuVmFyaWF0aW9uUgp2YXJpYXRpb25zGkEKCVZhcmlhdGlvbhIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIWCgZ3ZWlnaHQYAiABKAVSBndlaWdodCL4AQoIU3RyYXRlZ3kSNAoEdHlwZRgBIAEoDjIgLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5LlR5cGVSBHR5cGUSRwoOZml4ZWRfc3RyYXRlZ3kYAiABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5Ug1maXhlZFN0cmF0ZWd5Ek0KEHJvbGxvdXRfc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSD3JvbGxvdXRTdHJhdGVneSIeCgRUeXBlEgkKBUZJWEVEEAASCwoHUk9MTE9VVBABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqQIKGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvIoQBCgRSdWxlEg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgdjbGF1c2VzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqAEKGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSI8CgZUYXJnZXQSHAoJdmFyaWF0aW9uGAEgASgJUgl2YXJpYXRpb24SFAoFdXNlcnMYAiADKAlSBXVzZXJzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvQCCipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIvcBChNGZWF0dXJlTGFzdFVzZWRJbmZvEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uEiAKDGxhc3RfdXNlZF9hdBgDIAEoA1IKbGFzdFVzZWRBdBIdCgpjcmVhdGVkX2F0GAQgASgDUgljcmVhdGVkQXQSMgoVY2xpZW50X29sZGVzdF92ZXJzaW9uGAUgASgJUhNjbGllbnRPbGRlc3RWZXJzaW9uEjIKFWNsaWVudF9sYXRlc3RfdmVyc2lvbhgGIAEoCVITY2xpZW50TGF0ZXN0VmVyc2lvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCsIBCiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiUAoMUHJlcmVxdWlzaXRlEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKswwKG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvItIHCgdGZWF0dXJlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdlbmFibGVkGAQgASgIUgdlbmFibGVkEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSOQoWZXZhbHVhdGlvbl91bmRlbGF5YWJsZRgGIAEoCEICGAFSFWV2YWx1YXRpb25VbmRlbGF5YWJsZRIQCgN0dGwYByABKAVSA3R0bBIYCgd2ZXJzaW9uGAggASgFUgd2ZXJzaW9uEh0KCmNyZWF0ZWRfYXQYCSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAogASgDUgl1cGRhdGVkQXQSPAoKdmFyaWF0aW9ucxgLIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGA0gAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgOIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgPIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYECADKAlSBHRhZ3MSTAoObGFzdF91c2VkX2luZm8YESABKAsyJi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlTGFzdFVzZWRJbmZvUgxsYXN0VXNlZEluZm8SHgoKbWFpbnRhaW5lchgSIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgTIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRIaCghhcmNoaXZlZBgUIAEoCFIIYXJjaGl2ZWQSRQoNcHJlcmVxdWlzaXRlcxgVIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIjCg1zYW1wbGluZ19zZWVkGBYgASgJUgxzYW1wbGluZ1NlZWQiPgoNVmFyaWF0aW9uVHlwZRIKCgZTVFJJTkcQABILCgdCT09MRUFOEAESCgoGTlVNQkVSEAISCAoESlNPThADIlIKCEZlYXR1cmVzEjYKCGZlYXR1cmVzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMSDgoCaWQYAiABKAlSAmlkInMKEkVudmlyb25tZW50RmVhdHVyZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBI2CghmZWF0dXJlcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzImcKA1RhZxIOCgJpZBgBIAEoCVICaWQSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAQgASgJUgRuYW1lQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKtQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiggEKDFNlZ21lbnRVc2VycxIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSNAoFdXNlcnMYAiADKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlclIFdXNlcnMSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK5wMKI3Byb3RvL2Vudmlyb25tZW50L2Vudmlyb25tZW50LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQi6QIKDUVudmlyb25tZW50VjISDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEh0KCnByb2plY3RfaWQYBSABKAlSCXByb2plY3RJZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBInCg9vcmdhbml6YXRpb25faWQYCSABKAlSDm9yZ2FuaXphdGlvbklkEicKD3JlcXVpcmVfY29tbWVudBgKIAEoCFIOcmVxdWlyZUNvbW1lbnQSLAoSZmVhdHVyZV9mbGFnX2NvdW50GAsgASgFUhBmZWF0dXJlRmxhZ0NvdW50QjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCv0DCh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQigwMKB1Byb2plY3QSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUSJwoPb3JnYW5pemF0aW9uX2lkGAogASgJUg5vcmdhbml6YXRpb25JZBIrChFlbnZpcm9ubWVudF9jb3VudBgLIAEoBVIQZW52aXJvbm1lbnRDb3VudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYDCABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKrwQKJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IrADCgxPcmdhbml6YXRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSFAoFdHJpYWwYByABKAhSBXRyaWFsEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQSIQoMc3lzdGVtX2FkbWluGAogASgIUgtzeXN0ZW1BZG1pbhIjCg1wcm9qZWN0X2NvdW50GAsgASgFUgxwcm9qZWN0Q291bnQSKwoRZW52aXJvbm1lbnRfY291bnQYDCABKAVSEGVudmlyb25tZW50Q291bnQSHQoKdXNlcl9jb3VudBgNIAEoBVIJdXNlckNvdW50Eh8KC293bmVyX2VtYWlsGA4gASgJUgpvd25lckVtYWlsQjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCpADCiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50IukBCgxTZWFyY2hGaWx0ZXISDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFcXVlcnkYAyABKAlSBXF1ZXJ5ElEKEmZpbHRlcl90YXJnZXRfdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5hY2NvdW50LkZpbHRlclRhcmdldFR5cGVSEGZpbHRlclRhcmdldFR5cGUSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWQSJQoOZGVmYXVsdF9maWx0ZXIYBiABKAhSDWRlZmF1bHRGaWx0ZXIqMQoQRmlsdGVyVGFyZ2V0VHlwZRILCgdVTktOT1dOEAASEAoMRkVBVFVSRV9GTEFHEAFCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwrUEwobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8aH3Byb3RvL2Vudmlyb25tZW50L3Byb2plY3QucHJvdG8aJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxohcHJvdG8vYWNjb3VudC9zZWFyY2hfZmlsdGVyLnByb3RvIqsCCgdBY2NvdW50Eg4KAmlkGAEgASgJUgJpZBIUCgVlbWFpbBgCIAEoCVIFZW1haWwSEgoEbmFtZRgDIAEoCVIEbmFtZRIzCgRyb2xlGAQgASgOMh8uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudC5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCCABKAhSB2RlbGV0ZWQiOQoEUm9sZRIKCgZWSUVXRVIQABIKCgZFRElUT1IQARIJCgVPV05FUhACEg4KClVOQVNTSUdORUQQYzoCGAEivAgKCUFjY291bnRWMhIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBJGCg5zZWFyY2hfZmlsdGVycxgKIAMoCzIfLmJ1Y2tldGVlci5hY2NvdW50LlNlYXJjaEZpbHRlclINc2VhcmNoRmlsdGVycxIdCgpmaXJzdF9uYW1lGAsgASgJUglmaXJzdE5hbWUSGwoJbGFzdF9uYW1lGAwgASgJUghsYXN0TmFtZRIaCghsYW5ndWFnZRgNIAEoCVIIbGFuZ3VhZ2USGwoJbGFzdF9zZWVuGA4gASgDUghsYXN0U2VlbhIoChBhdmF0YXJfZmlsZV90eXBlGA8gASgJUg5hdmF0YXJGaWxlVHlwZRIhCgxhdmF0YXJfaW1hZ2UYECABKAxSC2F2YXRhckltYWdlEisKEWVudmlyb25tZW50X2NvdW50GBEgASgFUhBlbnZpcm9ubWVudENvdW50EhIKBHRhZ3MYEiADKAlSBHRhZ3Ma1wEKBFJvbGUiWQoLRW52aXJvbm1lbnQSGgoWRW52aXJvbm1lbnRfVU5BU1NJR05FRBAAEhYKEkVudmlyb25tZW50X1ZJRVdFUhABEhYKEkVudmlyb25tZW50X0VESVRPUhACInQKDE9yZ2FuaXphdGlvbhIbChdPcmdhbml6YXRpb25fVU5BU1NJR05FRBAAEhcKE09yZ2FuaXphdGlvbl9NRU1CRVIQARIWChJPcmdhbml6YXRpb25fQURNSU4QAhIWChJPcmdhbml6YXRpb25fT1dORVIQAxp7Cg9FbnZpcm9ubWVudFJvbGUSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSQQoEcm9sZRgCIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLkVudmlyb25tZW50UgRyb2xlIuoGCg5Db25zb2xlQWNjb3VudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgphdmF0YXJfdXJsGAMgASgJUglhdmF0YXJVcmwSJgoPaXNfc3lzdGVtX2FkbWluGAQgASgIUg1pc1N5c3RlbUFkbWluEkcKDG9yZ2FuaXphdGlvbhgFIAEoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDG9yZ2FuaXphdGlvbhJbChFvcmdhbml6YXRpb25fcm9sZRgGIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJeChFlbnZpcm9ubWVudF9yb2xlcxgHIAMoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNvbnNvbGVBY2NvdW50LkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxJGCg5zZWFyY2hfZmlsdGVycxgIIAMoCzIfLmJ1Y2tldGVlci5hY2NvdW50LlNlYXJjaEZpbHRlclINc2VhcmNoRmlsdGVycxIdCgpmaXJzdF9uYW1lGAkgASgJUglmaXJzdE5hbWUSGwoJbGFzdF9uYW1lGAogASgJUghsYXN0TmFtZRIaCghsYW5ndWFnZRgLIAEoCVIIbGFuZ3VhZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgMIAEoCVIOYXZhdGFyRmlsZVR5cGUSIQoMYXZhdGFyX2ltYWdlGA0gASgMUgthdmF0YXJJbWFnZRIbCglsYXN0X3NlZW4YDiABKANSCGxhc3RTZWVuGtYBCg9FbnZpcm9ubWVudFJvbGUSRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSOAoHcHJvamVjdBgCIAEoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ugdwcm9qZWN0EkEKBHJvbGUYAyABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5FbnZpcm9ubWVudFIEcm9sZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCuYGChtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90byK7AwoGQVBJS2V5Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEjIKBHJvbGUYAyABKA4yHi5idWNrZXRlZXIuYWNjb3VudC5BUElLZXkuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgEIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBIeCgptYWludGFpbmVyGAcgASgJUgptYWludGFpbmVyEhcKB2FwaV9rZXkYCCABKAlSBmFwaUtleRIgCgtkZXNjcmlwdGlvbhgJIAEoCVILZGVzY3JpcHRpb24SKQoQZW52aXJvbm1lbnRfbmFtZRgKIAEoCVIPZW52aXJvbm1lbnROYW1lInkKBFJvbGUSCwoHVU5LTk9XThAAEg4KClNES19DTElFTlQQARIOCgpTREtfU0VSVkVSEAISGAoUUFVCTElDX0FQSV9SRUFEX09OTFkQAxIUChBQVUJMSUNfQVBJX1dSSVRFEAQSFAoQUFVCTElDX0FQSV9BRE1JThAFIpUCChFFbnZpcm9ubWVudEFQSUtleRIyCgdhcGlfa2V5GAIgASgLMhkuYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5UgZhcGlLZXkSMQoUZW52aXJvbm1lbnRfZGlzYWJsZWQYAyABKAhSE2Vudmlyb25tZW50RGlzYWJsZWQSIQoKcHJvamVjdF9pZBgEIAEoCUICGAFSCXByb2plY3RJZBJGCgtlbnZpcm9ubWVudBgFIAEoCzIkLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFYyUgtlbnZpcm9ubWVudBIoChBwcm9qZWN0X3VybF9jb2RlGAYgASgJUg5wcm9qZWN0VXJsQ29kZUoECAEQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCpoLChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8ihgEKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEj4KC2FjdGlvbl90eXBlGAMgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSLfAgoST3BzRXZlbnRSYXRlQ2xhdXNlEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQSFwoHZ29hbF9pZBgDIAEoCVIGZ29hbElkEhsKCW1pbl9jb3VudBgEIAEoA1IIbWluQ291bnQSKQoQdGhyZWFkc2hvbGRfcmF0ZRgFIAEoAVIPdGhyZWFkc2hvbGRSYXRlEkoKCG9wZXJhdG9yGAYgASgOMi4uYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchI+CgthY3Rpb25fdHlwZRgHIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiJkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lEj4KC2FjdGlvbl90eXBlGAIgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADKjIKCkFjdGlvblR5cGUSCwoHVU5LTk9XThAAEgoKBkVOQUJMRRABEgsKB0RJU0FCTEUQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCr0FCiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90byLQAgoLQXV0b09wc1J1bGUSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgDIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgEIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQSSAoPYXV0b19vcHNfc3RhdHVzGAogASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1INYXV0b09wc1N0YXR1c0oECAYQByJUCgxBdXRvT3BzUnVsZXMSRAoOYXV0b19vcHNfcnVsZXMYASADKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVIMYXV0b09wc1J1bGVzKj8KB09wc1R5cGUSEAoMVFlQRV9VTktOT1dOEAASDAoIU0NIRURVTEUQAhIOCgpFVkVOVF9SQVRFEAMiBAgBEAEqRAoNQXV0b09wc1N0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK8AMKInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24itwIKCVJlY2lwaWVudBI6CgR0eXBlGAEgASgOMiYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnQuVHlwZVIEdHlwZRJlChdzbGFja19jaGFubmVsX3JlY2lwaWVudBgCIAEoCzItLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU2xhY2tDaGFubmVsUmVjaXBpZW50UhVzbGFja0NoYW5uZWxSZWNpcGllbnQSRgoIbGFuZ3VhZ2UYAyABKA4yKi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudC5MYW5ndWFnZVIIbGFuZ3VhZ2UiGAoEVHlwZRIQCgxTbGFja0NoYW5uZWwQACIlCghMYW5ndWFnZRILCgdFTkdMSVNIEAASDAoISkFQQU5FU0UQASI4ChVTbGFja0NoYW5uZWxSZWNpcGllbnQSHwoLd2ViaG9va191cmwYASABKAlSCndlYmhvb2tVcmxCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCuUICiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvEhZidWNrZXRlZXIubm90aWZpY2F0aW9uGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvIr8HCgxTdWJzY3JpcHRpb24SDgoCaWQYASABKAlSAmlkEh0KCmNyZWF0ZWRfYXQYAiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAMgASgDUgl1cGRhdGVkQXQSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkElIKDHNvdXJjZV90eXBlcxgFIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEj8KCXJlY2lwaWVudBgGIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50UglyZWNpcGllbnQSEgoEbmFtZRgHIAEoCVIEbmFtZRIlCg5lbnZpcm9ubWVudF9pZBgIIAEoCVINZW52aXJvbm1lbnRJZBIpChBlbnZpcm9ubWVudF9uYW1lGAkgASgJUg9lbnZpcm9ubWVudE5hbWUiyQQKClNvdXJjZVR5cGUSGAoURE9NQUlOX0VWRU5UX0ZFQVRVUkUQABIVChFET01BSU5fRVZFTlRfR09BTBABEhsKF0RPTUFJTl9FVkVOVF9FWFBFUklNRU5UEAISGAoURE9NQUlOX0VWRU5UX0FDQ09VTlQQAxIXChNET01BSU5fRVZFTlRfQVBJS0VZEAQSGAoURE9NQUlOX0VWRU5UX1NFR01FTlQQBRIcChhET01BSU5fRVZFTlRfRU5WSVJPTk1FTlQQBhIeChpET01BSU5fRVZFTlRfQURNSU5fQUNDT1VOVBAHEh0KGURPTUFJTl9FVkVOVF9BVVRPT1BTX1JVTEUQCBIVChFET01BSU5fRVZFTlRfUFVTSBAJEh0KGURPTUFJTl9FVkVOVF9TVUJTQ1JJUFRJT04QChIjCh9ET01BSU5fRVZFTlRfQURNSU5fU1VCU0NSSVBUSU9OEAsSGAoURE9NQUlOX0VWRU5UX1BST0pFQ1QQDBIYChRET01BSU5fRVZFTlRfV0VCSE9PSxANEiQKIERPTUFJTl9FVkVOVF9QUk9HUkVTU0lWRV9ST0xMT1VUEA4SHQoZRE9NQUlOX0VWRU5UX09SR0FOSVpBVElPThAPEh0KGURPTUFJTl9FVkVOVF9GTEFHX1RSSUdHRVIQEBIUChBET01BSU5fRVZFTlRfVEFHEBESEQoNRkVBVFVSRV9TVEFMRRBkEhcKEkVYUEVSSU1FTlRfUlVOTklORxDIARIOCglNQVVfQ09VTlQQrAJCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCvcFCidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIuIEChJQcm9ncmVzc2l2ZVJvbGxvdXQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIsCgZjbGF1c2UYAyABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2USRAoGc3RhdHVzGAQgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c1IGc3RhdHVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSPgoEdHlwZRgHIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlUgR0eXBlEk4KCnN0b3BwZWRfYnkYCCABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkSHQoKc3RvcHBlZF9hdBgJIAEoA1IJc3RvcHBlZEF0IjIKBFR5cGUSEwoPTUFOVUFMX1NDSEVEVUxFEAASFQoRVEVNUExBVEVfU0NIRURVTEUQASI9CgZTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARIMCghGSU5JU0hFRBACEgsKB1NUT1BQRUQQAyJJCglTdG9wcGVkQnkSCwoHVU5LTk9XThAAEggKBFVTRVIQARIQCgxPUFNfU0NIRURVTEUQAhITCg9PUFNfS0lMTF9TV0lUQ0gQA0IxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCqAFCiBwcm90by9mZWF0dXJlL2ZsYWdfdHJpZ2dlci5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUirQQKC0ZsYWdUcmlnZ2VyEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEiMKDXRyaWdnZXJfY291bnQYByABKAVSDHRyaWdnZXJDb3VudBIqChFsYXN0X3RyaWdnZXJlZF9hdBgIIAEoA1IPbGFzdFRyaWdnZXJlZEF0EhQKBXRva2VuGAkgASgJUgV0b2tlbhIaCghkaXNhYmxlZBgKIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgLIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYDCABKANSCXVwZGF0ZWRBdBIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZCIqCgRUeXBlEhAKDFR5cGVfVU5LTk9XThAAEhAKDFR5cGVfV0VCSE9PSxABIjsKBkFjdGlvbhISCg5BY3Rpb25fVU5LTk9XThAAEg0KCUFjdGlvbl9PThABEg4KCkFjdGlvbl9PRkYQAkoECAMQBEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCuYCChNwcm90by90YWcvdGFnLnByb3RvEg1idWNrZXRlZXIudGFnIogCCgNUYWcSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKY3JlYXRlZF9hdBgDIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBCABKANSCXVwZGF0ZWRBdBI+CgtlbnRpdHlfdHlwZRgFIAEoDjIdLmJ1Y2tldGVlci50YWcuVGFnLkVudGl0eVR5cGVSCmVudGl0eVR5cGUSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWQiOAoKRW50aXR5VHlwZRILCgdVTktOT1dOEAASEAoMRkVBVFVSRV9GTEFHEAESCwoHQUNDT1VOVBACQi1aK2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by90YWdiBnByb3RvMwrpywEKHnByb3RvL2V2ZW50L2RvbWFpbi9ldmVudC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50LmRvbWFpbhoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGhpwcm90by9mZWF0dXJlL2NsYXVzZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvGhhwcm90by9mZWF0dXJlL3J1bGUucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGhtwcm90by9mZWF0dXJlL3NlZ21lbnQucHJvdG8aGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvGhtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8aG3Byb3RvL2FjY291bnQvYXBpX2tleS5wcm90bxohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxolcHJvdG8vbm90aWZpY2F0aW9uL3N1YnNjcmlwdGlvbi5wcm90bxoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90bxogcHJvdG8vZmVhdHVyZS9wcmVyZXF1aXNpdGUucHJvdG8aJ3Byb3RvL2F1dG9vcHMvcHJvZ3Jlc3NpdmVfcm9sbG91dC5wcm90bxogcHJvdG8vZmVhdHVyZS9mbGFnX3RyaWdnZXIucHJvdG8aIXByb3RvL2FjY291bnQvc2VhcmNoX2ZpbHRlci5wcm90bxoTcHJvdG8vdGFnL3RhZy5wcm90byKALwoFRXZlbnQSDgoCaWQYASABKAlSAmlkEhwKCXRpbWVzdGFtcBgCIAEoA1IJdGltZXN0YW1wEkkKC2VudGl0eV90eXBlGAMgASgOMiguYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FdmVudC5FbnRpdHlUeXBlUgplbnRpdHlUeXBlEhsKCWVudGl0eV9pZBgEIAEoCVIIZW50aXR5SWQSNgoEdHlwZRgFIAEoDjIiLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuVHlwZVIEdHlwZRI2CgZlZGl0b3IYBiABKAsyHi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkVkaXRvclIGZWRpdG9yEigKBGRhdGEYByABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgRkYXRhEiQKDmlzX2FkbWluX2V2ZW50GAkgASgIUgxpc0FkbWluRXZlbnQSOQoHb3B0aW9ucxgKIAEoCzIfLmJ1Y2tldGVlci5ldmVudC5kb21haW4uT3B0aW9uc1IHb3B0aW9ucxIfCgtlbnRpdHlfZGF0YRgLIAEoCVIKZW50aXR5RGF0YRIwChRwcmV2aW91c19lbnRpdHlfZGF0YRgMIAEoCVIScHJldmlvdXNFbnRpdHlEYXRhEiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkIpwCCgpFbnRpdHlUeXBlEgsKB0ZFQVRVUkUQABIICgRHT0FMEAESDgoKRVhQRVJJTUVOVBACEgsKB0FDQ09VTlQQAxIKCgZBUElLRVkQBBILCgdTRUdNRU5UEAUSDwoLRU5WSVJPTk1FTlQQBhIRCg1BRE1JTl9BQ0NPVU5UEAcSEAoMQVVUT09QU19SVUxFEAgSCAoEUFVTSBAJEhAKDFNVQlNDUklQVElPThAKEhYKEkFETUlOX1NVQlNDUklQVElPThALEgsKB1BST0pFQ1QQDBIXChNQUk9HUkVTU0lWRV9ST0xMT1VUEA4SEAoMT1JHQU5JWkFUSU9OEA8SEAoMRkxBR19UUklHR0VSEBASBwoDVEFHEBEiBAgNEA0ixigKBFR5cGUSCwoHVU5LTk9XThAAEhMKD0ZFQVRVUkVfQ1JFQVRFRBABEhMKD0ZFQVRVUkVfUkVOQU1FRBACEhMKD0ZFQVRVUkVfRU5BQkxFRBADEhQKEEZFQVRVUkVfRElTQUJMRUQQBBITCg9GRUFUVVJFX0RFTEVURUQQBRIfChtGRUFUVVJFX0RFU0NSSVBUSU9OX0NIQU5HRUQQCBIbChdGRUFUVVJFX1ZBUklBVElPTl9BRERFRBAJEh0KGUZFQVRVUkVfVkFSSUFUSU9OX1JFTU9WRUQQChIhCh1GRUFUVVJFX09GRl9WQVJJQVRJT05fQ0hBTkdFRBALEhsKF1ZBUklBVElPTl9WQUxVRV9DSEFOR0VEEAwSGgoWVkFSSUFUSU9OX05BTUVfQ0hBTkdFRBANEiEKHVZBUklBVElPTl9ERVNDUklQVElPTl9DSEFOR0VEEA4SGAoUVkFSSUFUSU9OX1VTRVJfQURERUQQDxIaChZWQVJJQVRJT05fVVNFUl9SRU1PVkVEEBASFgoSRkVBVFVSRV9SVUxFX0FEREVEEBESIQodRkVBVFVSRV9SVUxFX1NUUkFURUdZX0NIQU5HRUQQEhIYChRGRUFUVVJFX1JVTEVfREVMRVRFRBATEhUKEVJVTEVfQ0xBVVNFX0FEREVEEBQSFwoTUlVMRV9DTEFVU0VfREVMRVRFRBAVEh8KG1JVTEVfRklYRURfU1RSQVRFR1lfQ0hBTkdFRBAWEiEKHVJVTEVfUk9MTE9VVF9TVFJBVEVHWV9DSEFOR0VEEBcSHAoYQ0xBVVNFX0FUVFJJQlVURV9DSEFOR0VEEBgSGwoXQ0xBVVNFX09QRVJBVE9SX0NIQU5HRUQQGRIWChJDTEFVU0VfVkFMVUVfQURERUQQGhIYChRDTEFVU0VfVkFMVUVfUkVNT1ZFRBAbEiQKIEZFQVRVUkVfREVGQVVMVF9TVFJBVEVHWV9DSEFOR0VEEBwSFQoRRkVBVFVSRV9UQUdfQURERUQQHRIXChNGRUFUVVJFX1RBR19SRU1PVkVEEB4SHwobRkVBVFVSRV9WRVJTSU9OX0lOQ1JFTUVOVEVEEB8SFAoQRkVBVFVSRV9BUkNISVZFRBAgEhIKDkZFQVRVUkVfQ0xPTkVEECESFgoSRkVBVFVSRV9VTkFSQ0hJVkVEECMSFwoTU0FNUExJTkdfU0VFRF9SRVNFVBAiEhYKElBSRVJFUVVJU0lURV9BRERFRBAkEhgKFFBSRVJFUVVJU0lURV9SRU1PVkVEECUSIgoeUFJFUkVRVUlTSVRFX1ZBUklBVElPTl9DSEFOR0VEECYSHwobRkVBVFVSRV9SVUxFU19PUkRFUl9DSEFOR0VEECcSEwoPRkVBVFVSRV9VUERBVEVEECgSEAoMR09BTF9DUkVBVEVEEGQSEAoMR09BTF9SRU5BTUVEEGUSHAoYR09BTF9ERVNDUklQVElPTl9DSEFOR0VEEGYSEAoMR09BTF9ERUxFVEVEEGcSEQoNR09BTF9BUkNISVZFRBBoEhcKEkVYUEVSSU1FTlRfQ1JFQVRFRBDIARIXChJFWFBFUklNRU5UX1NUT1BQRUQQyQESIAobRVhQRVJJTUVOVF9TVEFSVF9BVF9DSEFOR0VEEMoBEh8KGkVYUEVSSU1FTlRfU1RPUF9BVF9DSEFOR0VEEMsBEhcKEkVYUEVSSU1FTlRfREVMRVRFRBDMARIeChlFWFBFUklNRU5UX1BFUklPRF9DSEFOR0VEEM0BEhwKF0VYUEVSSU1FTlRfTkFNRV9DSEFOR0VEEM4BEiMKHkVYUEVSSU1FTlRfREVTQ1JJUFRJT05fQ0hBTkdFRBDPARIXChJFWFBFUklNRU5UX1NUQVJURUQQ0AESGAoTRVhQRVJJTUVOVF9GSU5JU0hFRBDRARIYChNFWFBFUklNRU5UX0FSQ0hJVkVEENIBEhgKD0FDQ09VTlRfQ1JFQVRFRBCsAhoCCAESHQoUQUNDT1VOVF9ST0xFX0NIQU5HRUQQrQIaAggBEhgKD0FDQ09VTlRfRU5BQkxFRBCuAhoCCAESGQoQQUNDT1VOVF9ESVNBQkxFRBCvAhoCCAESGAoPQUNDT1VOVF9ERUxFVEVEELACGgIIARIXChJBQ0NPVU5UX1YyX0NSRUFURUQQsQISHAoXQUNDT1VOVF9WMl9OQU1FX0NIQU5HRUQQsgISKAojQUNDT1VOVF9WMl9BVkFUQVJfSU1BR0VfVVJMX0NIQU5HRUQQswISKQokQUNDT1VOVF9WMl9PUkdBTklaQVRJT05fUk9MRV9DSEFOR0VEELQCEikKJEFDQ09VTlRfVjJfRU5WSVJPTk1FTlRfUk9MRVNfQ0hBTkdFRBC1AhIXChJBQ0NPVU5UX1YyX0VOQUJMRUQQtgISGAoTQUNDT1VOVF9WMl9ESVNBQkxFRBC3AhIXChJBQ0NPVU5UX1YyX0RFTEVURUQQuAISJQogQUNDT1VOVF9WMl9DUkVBVEVEX1NFQVJDSF9GSUxURVIQuQISKgolQUNDT1VOVF9WMl9TRUFSQ0hfRklMVEVSX05BTkVfQ0hBTkdFRBC6AhIrCiZBQ0NPVU5UX1YyX1NFQVJDSF9GSUxURVJfUVVFUllfQ0hBTkdFRBC7AhItCihBQ0NPVU5UX1YyX1NFQVJDSF9GSUxURVJfREVGQVVMVF9DSEFOR0VEELwCEiUKIEFDQ09VTlRfVjJfU0VBUkNIX0ZJTFRFUl9ERUxFVEVEEL0CEiIKHUFDQ09VTlRfVjJfRklSU1RfTkFNRV9DSEFOR0VEEL4CEiEKHEFDQ09VTlRfVjJfTEFTVF9OQU1FX0NIQU5HRUQQvwISIAobQUNDT1VOVF9WMl9MQU5HVUFHRV9DSEFOR0VEEMACEhcKEkFDQ09VTlRfVjJfVVBEQVRFRBDBAhIcChdBQ0NPVU5UX1YyX1RBR1NfQ0hBTkdFRBDCAhITCg5BUElLRVlfQ1JFQVRFRBCQAxIYChNBUElLRVlfTkFNRV9DSEFOR0VEEJEDEhMKDkFQSUtFWV9FTkFCTEVEEJIDEhQKD0FQSUtFWV9ESVNBQkxFRBCTAxITCg5BUElLRVlfQ0hBTkdFRBCUAxIUCg9TRUdNRU5UX0NSRUFURUQQ9AMSFAoPU0VHTUVOVF9ERUxFVEVEEPUDEhkKFFNFR01FTlRfTkFNRV9DSEFOR0VEEPYDEiAKG1NFR01FTlRfREVTQ1JJUFRJT05fQ0hBTkdFRBD3AxIXChJTRUdNRU5UX1JVTEVfQURERUQQ+AMSGQoUU0VHTUVOVF9SVUxFX0RFTEVURUQQ+QMSHgoZU0VHTUVOVF9SVUxFX0NMQVVTRV9BRERFRBD6AxIgChtTRUdNRU5UX1JVTEVfQ0xBVVNFX0RFTEVURUQQ+wMSJQogU0VHTUVOVF9DTEFVU0VfQVRUUklCVVRFX0NIQU5HRUQQ/AMSJAofU0VHTUVOVF9DTEFVU0VfT1BFUkFUT1JfQ0hBTkdFRBD9AxIfChpTRUdNRU5UX0NMQVVTRV9WQUxVRV9BRERFRBD+AxIhChxTRUdNRU5UX0NMQVVTRV9WQUxVRV9SRU1PVkVEEP8DEhcKElNFR01FTlRfVVNFUl9BRERFRBCABBIZChRTRUdNRU5UX1VTRVJfREVMRVRFRBCBBBIeChlTRUdNRU5UX0JVTEtfVVBMT0FEX1VTRVJTEIIEEi0KKFNFR01FTlRfQlVMS19VUExPQURfVVNFUlNfU1RBVFVTX0NIQU5HRUQQgwQSFAoPU0VHTUVOVF9VUERBVEVEEIQEEhgKE0VOVklST05NRU5UX0NSRUFURUQQ2AQSGAoTRU5WSVJPTk1FTlRfUkVOQU1FRBDZBBIkCh9FTlZJUk9OTUVOVF9ERVNDUklQVElPTl9DSEFOR0VEENoEEhgKE0VOVklST05NRU5UX0RFTEVURUQQ2wQSGwoWRU5WSVJPTk1FTlRfVjJfQ1JFQVRFRBDcBBIbChZFTlZJUk9OTUVOVF9WMl9SRU5BTUVEEN0EEicKIkVOVklST05NRU5UX1YyX0RFU0NSSVBUSU9OX0NIQU5HRUQQ3gQSHAoXRU5WSVJPTk1FTlRfVjJfQVJDSElWRUQQ3wQSHgoZRU5WSVJPTk1FTlRfVjJfVU5BUkNISVZFRBDgBBIrCiZFTlZJUk9OTUVOVF9WMl9SRVFVSVJFX0NPTU1FTlRfQ0hBTkdFRBDhBBIeChVBRE1JTl9BQ0NPVU5UX0NSRUFURUQQvAUaAggBEh4KFUFETUlOX0FDQ09VTlRfRU5BQkxFRBC+BRoCCAESHwoWQURNSU5fQUNDT1VOVF9ESVNBQkxFRBC/BRoCCAESGQoUQVVUT09QU19SVUxFX0NSRUFURUQQoAYSGQoUQVVUT09QU19SVUxFX0RFTEVURUQQoQYSIgodQVVUT09QU19SVUxFX09QU19UWVBFX0NIQU5HRUQQogYSIAobQVVUT09QU19SVUxFX0NMQVVTRV9ERUxFVEVEEKMGEioKIUFVVE9PUFNfUlVMRV9UUklHR0VSRURfQVRfQ0hBTkdFRBCkBhoCCAESIAobT1BTX0VWRU5UX1JBVEVfQ0xBVVNFX0FEREVEEKUGEiIKHU9QU19FVkVOVF9SQVRFX0NMQVVTRV9DSEFOR0VEEKYGEhoKFURBVEVUSU1FX0NMQVVTRV9BRERFRBCnBhIcChdEQVRFVElNRV9DTEFVU0VfQ0hBTkdFRBCoBhIZChRBVVRPT1BTX1JVTEVfU1RPUFBFRBCpBhIkCh9BVVRPT1BTX1JVTEVfT1BTX1NUQVRVU19DSEFOR0VEEKoGEhEKDFBVU0hfQ1JFQVRFRBCEBxIRCgxQVVNIX0RFTEVURUQQhQcSFAoPUFVTSF9UQUdTX0FEREVEEIYHEhYKEVBVU0hfVEFHU19ERUxFVEVEEIcHEhEKDFBVU0hfUkVOQU1FRBCIBxIRCgxQVVNIX1VQREFURUQQiQcSGQoUU1VCU0NSSVBUSU9OX0NSRUFURUQQ6AcSGQoUU1VCU0NSSVBUSU9OX0RFTEVURUQQ6QcSGQoUU1VCU0NSSVBUSU9OX0VOQUJMRUQQ6gcSGgoVU1VCU0NSSVBUSU9OX0RJU0FCTEVEEOsHEiMKHlNVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9BRERFRBDsBxIlCiBTVUJTQ1JJUFRJT05fU09VUkNFX1RZUEVfREVMRVRFRBDtBxIZChRTVUJTQ1JJUFRJT05fUkVOQU1FRBDuBxIZChRTVUJTQ1JJUFRJT05fVVBEQVRFRBDvBxIfChpBRE1JTl9TVUJTQ1JJUFRJT05fQ1JFQVRFRBDMCBIfChpBRE1JTl9TVUJTQ1JJUFRJT05fREVMRVRFRBDNCBIfChpBRE1JTl9TVUJTQ1JJUFRJT05fRU5BQkxFRBDOCBIgChtBRE1JTl9TVUJTQ1JJUFRJT05fRElTQUJMRUQQzwgSKQokQURNSU5fU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0FEREVEENAIEisKJkFETUlOX1NVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9ERUxFVEVEENEIEh8KGkFETUlOX1NVQlNDUklQVElPTl9SRU5BTUVEENIIEhQKD1BST0pFQ1RfQ1JFQVRFRBCwCRIgChtQUk9KRUNUX0RFU0NSSVBUSU9OX0NIQU5HRUQQsQkSFAoPUFJPSkVDVF9FTkFCTEVEELIJEhUKEFBST0pFQ1RfRElTQUJMRUQQswkSGgoVUFJPSkVDVF9UUklBTF9DUkVBVEVEELQJEhwKF1BST0pFQ1RfVFJJQUxfQ09OVkVSVEVEELUJEhQKD1BST0pFQ1RfUkVOQU1FRBC2CRIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX0NSRUFURUQQ+AoSIAobUFJPR1JFU1NJVkVfUk9MTE9VVF9ERUxFVEVEEPkKEjYKMVBST0dSRVNTSVZFX1JPTExPVVRfU0NIRURVTEVfVFJJR0dFUkVEX0FUX0NIQU5HRUQQ+goSIAobUFJPR1JFU1NJVkVfUk9MTE9VVF9TVE9QUEVEEPsKEhkKFE9SR0FOSVpBVElPTl9DUkVBVEVEENwLEh4KGU9SR0FOSVpBVElPTl9OQU1FX0NIQU5HRUQQ3QsSJQogT1JHQU5JWkFUSU9OX0RFU0NSSVBUSU9OX0NIQU5HRUQQ3gsSGQoUT1JHQU5JWkFUSU9OX0VOQUJMRUQQ3wsSGgoVT1JHQU5JWkFUSU9OX0RJU0FCTEVEEOALEhoKFU9SR0FOSVpBVElPTl9BUkNISVZFRBDhCxIcChdPUkdBTklaQVRJT05fVU5BUkNISVZFRBDiCxIhChxPUkdBTklaQVRJT05fVFJJQUxfQ09OVkVSVEVEEOMLEiUKIE9SR0FOSVpBVElPTl9PV05FUl9FTUFJTF9DSEFOR0VEEOQLEhkKFEZMQUdfVFJJR0dFUl9DUkVBVEVEEMEMEhcKEkZMQUdfVFJJR0dFUl9SRVNFVBDCDBIlCiBGTEFHX1RSSUdHRVJfREVTQ1JJUFRJT05fQ0hBTkdFRBDDDBIaChVGTEFHX1RSSUdHRVJfRElTQUJMRUQQxAwSGQoURkxBR19UUklHR0VSX0VOQUJMRUQQxQwSGQoURkxBR19UUklHR0VSX0RFTEVURUQQxgwSHwoaRkxBR19UUklHR0VSX1VTQUdFX1VQREFURUQQxwwSEAoLVEFHX0NSRUFURUQQpQ0SEAoLVEFHX0RFTEVURUQQpg0iBgiUChCUCiIGCJUKEJUKIgYIlgoQlgoiBgiXChCXCiIGCJgKEJgKIgYImQoQmQpKBAgIEAkijAIKBkVkaXRvchIUCgVlbWFpbBgBIAEoCVIFZW1haWwSGQoIaXNfYWRtaW4YAyABKAhSB2lzQWRtaW4SEgoEbmFtZRgEIAEoCVIEbmFtZRJaChFwdWJsaWNfYXBpX2VkaXRvchgFIAEoCzIuLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRWRpdG9yLlB1YmxpY0FQSUVkaXRvclIPcHVibGljQXBpRWRpdG9yGlsKD1B1YmxpY0FQSUVkaXRvchIUCgV0b2tlbhgBIAEoCVIFdG9rZW4SHgoKbWFpbnRhaW5lchgCIAEoCVIKbWFpbnRhaW5lchISCgRuYW1lGAMgASgJUgRuYW1lSgQIAhADIkQKB09wdGlvbnMSGAoHY29tbWVudBgBIAEoCVIHY29tbWVudBIfCgtuZXdfdmVyc2lvbhgCIAEoBVIKbmV3VmVyc2lvbiLzBAoTRmVhdHVyZUNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SEgoEdXNlchgEIAEoCVIEdXNlchI8Cgp2YXJpYXRpb25zGAUgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zElgKGmRlZmF1bHRfb25fdmFyaWF0aW9uX2luZGV4GAYgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSF2RlZmF1bHRPblZhcmlhdGlvbkluZGV4EloKG2RlZmF1bHRfb2ZmX3ZhcmlhdGlvbl9pbmRleBgHIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhhkZWZhdWx0T2ZmVmFyaWF0aW9uSW5kZXgSTwoOdmFyaWF0aW9uX3R5cGUYCCABKA4yKC5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlLlZhcmlhdGlvblR5cGVSDXZhcmlhdGlvblR5cGUSEgoEdGFncxgJIAMoCVIEdGFncxJFCg1wcmVyZXF1aXNpdGVzGAogAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEi0KBXJ1bGVzGAsgAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSMwoHdGFyZ2V0cxgMIAMoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlRhcmdldFIHdGFyZ2V0cyJmChNGZWF0dXJlVXBkYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIWCgRkYXRhGAIgASgJQgIYAVIEZGF0YRInCg1wcmV2aW91c19kYXRhGAMgASgJQgIYAVIMcHJldmlvdXNEYXRhIiUKE0ZlYXR1cmVFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiYKFEZlYXR1cmVEaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCImChRGZWF0dXJlQXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiKAoWRmVhdHVyZVVuYXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiJQoTRmVhdHVyZURlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiLQobRXZhbHVhdGlvbkRlbGF5YWJsZVNldEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIvCh1FdmFsdWF0aW9uVW5kZWxheWFibGVTZXRFdmVudBIOCgJpZBgBIAEoCVICaWQiOQoTRmVhdHVyZVJlbmFtZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJSCh5GZWF0dXJlRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiJWCh9GZWF0dXJlT2ZmVmFyaWF0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIjCg1vZmZfdmFyaWF0aW9uGAIgASgJUgxvZmZWYXJpYXRpb24iaAoaRmVhdHVyZVZhcmlhdGlvbkFkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEjoKCXZhcmlhdGlvbhgCIAEoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIJdmFyaWF0aW9uIlEKHEZlYXR1cmVWYXJpYXRpb25SZW1vdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQiYQoaVmFyaWF0aW9uVmFsdWVDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBIUCgV2YWx1ZRgDIAEoCVIFdmFsdWUiXgoZVmFyaWF0aW9uTmFtZUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSDgoCaWQYAiABKAlSAmlkEhIKBG5hbWUYAyABKAlSBG5hbWUicwogVmFyaWF0aW9uRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24iXAoXVmFyaWF0aW9uVXNlckFkZGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBISCgR1c2VyGAMgASgJUgR1c2VyIl4KGVZhcmlhdGlvblVzZXJSZW1vdmVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBISCgR1c2VyGAMgASgJUgR1c2VyIlQKFUZlYXR1cmVSdWxlQWRkZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSKwoEcnVsZRgCIAEoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBHJ1bGUikQEKHkZlYXR1cmVDaGFuZ2VSdWxlU3RyYXRlZ3lFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjcKCHN0cmF0ZWd5GAMgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSCHN0cmF0ZWd5IlkKHUZlYXR1cmVSdWxlc09yZGVyQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIZCghydWxlX2lkcxgCIAMoCVIHcnVsZUlkcyJCChdGZWF0dXJlUnVsZURlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIpgBCiBGZWF0dXJlRml4ZWRTdHJhdGVneUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjwKCHN0cmF0ZWd5GAMgASgLMiAuYnVja2V0ZWVyLmZlYXR1cmUuRml4ZWRTdHJhdGVneVIIc3RyYXRlZ3kinAEKIkZlYXR1cmVSb2xsb3V0U3RyYXRlZ3lDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI+CghzdHJhdGVneRgDIAEoCzIiLmJ1Y2tldGVlci5mZWF0dXJlLlJvbGxvdXRTdHJhdGVneVIIc3RyYXRlZ3kigQEKFFJ1bGVDbGF1c2VBZGRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSMQoGY2xhdXNlGAMgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgZjbGF1c2UiYAoWUnVsZUNsYXVzZURlbGV0ZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZCKDAQobQ2xhdXNlQXR0cmlidXRlQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSDgoCaWQYAyABKAlSAmlkEhwKCWF0dHJpYnV0ZRgEIAEoCVIJYXR0cmlidXRlIqQBChpDbGF1c2VPcGVyYXRvckNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBI+CghvcGVyYXRvchgEIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3IidQoVQ2xhdXNlVmFsdWVBZGRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSDgoCaWQYAyABKAlSAmlkEhQKBXZhbHVlGAQgASgJUgV2YWx1ZSJ3ChdDbGF1c2VWYWx1ZVJlbW92ZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUibQoiRmVhdHVyZURlZmF1bHRTdHJhdGVneUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSNwoIc3RyYXRlZ3kYAiABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIIc3RyYXRlZ3kiOAoURmVhdHVyZVRhZ0FkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhAKA3RhZxgCIAEoCVIDdGFnIjoKFkZlYXR1cmVUYWdSZW1vdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhAKA3RhZxgCIAEoCVIDdGFnIkoKHkZlYXR1cmVWZXJzaW9uSW5jcmVtZW50ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSGAoHdmVyc2lvbhgCIAEoBVIHdmVyc2lvbiK1BAoSRmVhdHVyZUNsb25lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhI8Cgp2YXJpYXRpb25zGAQgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zEjMKB3RhcmdldHMYBSADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMSLQoFcnVsZXMYBiADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxJGChBkZWZhdWx0X3N0cmF0ZWd5GAcgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSD2RlZmF1bHRTdHJhdGVneRIjCg1vZmZfdmFyaWF0aW9uGAggASgJUgxvZmZWYXJpYXRpb24SEgoEdGFncxgJIAMoCVIEdGFncxIeCgptYWludGFpbmVyGAogASgJUgptYWludGFpbmVyEk8KDnZhcmlhdGlvbl90eXBlGAsgASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlEkUKDXByZXJlcXVpc2l0ZXMYDCADKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDXByZXJlcXVpc2l0ZXMiRAodRmVhdHVyZVNhbXBsaW5nU2VlZFJlc2V0RXZlbnQSIwoNc2FtcGxpbmdfc2VlZBgBIAEoCVIMc2FtcGxpbmdTZWVkIrABChBHb2FsQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWxldGVkGAQgASgIUgdkZWxldGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQiNgoQR29hbFJlbmFtZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJPChtHb2FsRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiIjChFHb2FsQXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiIgoQR29hbERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQi8wMKFkV4cGVyaW1lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSGwoHZ29hbF9pZBgFIAEoCUICGAFSBmdvYWxJZBIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSGAoHc3RvcHBlZBgIIAEoCFIHc3RvcHBlZBIdCgpzdG9wcGVkX2F0GAkgASgDUglzdG9wcGVkQXQSHQoKY3JlYXRlZF9hdBgKIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCyABKANSCXVwZGF0ZWRBdBIZCghnb2FsX2lkcxgMIAMoCVIHZ29hbElkcxISCgRuYW1lGA0gASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGA4gASgJUgtkZXNjcmlwdGlvbhIqChFiYXNlX3ZhcmlhdGlvbl9pZBgPIAEoCVIPYmFzZVZhcmlhdGlvbklkIkcKFkV4cGVyaW1lbnRTdG9wcGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCnN0b3BwZWRfYXQYAiABKANSCXN0b3BwZWRBdCIpChdFeHBlcmltZW50QXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiKAoWRXhwZXJpbWVudERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiSgodRXhwZXJpbWVudFN0YXJ0QXRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0IkcKHEV4cGVyaW1lbnRTdG9wQXRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3N0b3BfYXQYAiABKANSBnN0b3BBdCJiChxFeHBlcmltZW50UGVyaW9kQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIZCghzdGFydF9hdBgCIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAMgASgDUgZzdG9wQXQiQAoaRXhwZXJpbWVudE5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVQohRXhwZXJpbWVudERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iGAoWRXhwZXJpbWVudFN0YXJ0ZWRFdmVudCIZChdFeHBlcmltZW50RmluaXNoZWRFdmVudCKSBAoVQWNjb3VudFYyQ3JlYXRlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEigKEGF2YXRhcl9pbWFnZV91cmwYAyABKAlSDmF2YXRhckltYWdlVXJsEicKD29yZ2FuaXphdGlvbl9pZBgEIAEoCVIOb3JnYW5pemF0aW9uSWQSWwoRb3JnYW5pemF0aW9uX3JvbGUYBSABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEhoKCGRpc2FibGVkGAcgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0Eh0KCmZpcnN0X25hbWUYCiABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCyABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAwgASgJUghsYW5ndWFnZRISCgR0YWdzGA0gAygJUgR0YWdzIlYKFUFjY291bnRWMlVwZGF0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZCJFChlBY2NvdW50VjJOYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lImUKI0FjY291bnRWMkF2YXRhckltYWdlVVJMQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIoChBhdmF0YXJfaW1hZ2VfdXJsGAIgASgJUg5hdmF0YXJJbWFnZVVybCJFChlBY2NvdW50VjJUYWdzQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgR0YWdzGAIgAygJUgR0YWdzIpoBCiVBY2NvdW50VjJPcmdhbml6YXRpb25Sb2xlQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBJbChFvcmdhbml6YXRpb25fcm9sZRgCIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZSKYAQolQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NoYW5nZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSWQoRZW52aXJvbm1lbnRfcm9sZXMYAiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzIi0KFUFjY291bnRWMkVuYWJsZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiLgoWQWNjb3VudFYyRGlzYWJsZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiLQoVQWNjb3VudFYyRGVsZXRlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbCLXAQoYU2VhcmNoRmlsdGVyQ3JlYXRlZEV2ZW50EhIKBE5hbWUYASABKAlSBE5hbWUSFAoFUXVlcnkYAiABKAlSBVF1ZXJ5EkMKClRhcmdldFR5cGUYAyABKA4yIy5idWNrZXRlZXIuYWNjb3VudC5GaWx0ZXJUYXJnZXRUeXBlUgpUYXJnZXRUeXBlEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkEiUKDmRlZmF1bHRfZmlsdGVyGAUgASgIUg1kZWZhdWx0RmlsdGVyIkIKHFNlYXJjaEZpbHRlck5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBE5hbWUYAiABKAlSBE5hbWUiRQodU2VhcmNoRmlsdGVyUXVlcnlDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhQKBVF1ZXJ5GAIgASgJUgVRdWVyeSJYCh9TZWFyY2hGaWx0ZXJEZWZhdWx0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIlCg5kZWZhdWx0X2ZpbHRlchgCIAEoCFINZGVmYXVsdEZpbHRlciIqChhTZWFyY2hGaWx0ZXJEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIv8BChJBUElLZXlDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSMgoEcm9sZRgDIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Eh4KCm1haW50YWluZXIYByABKAlSCm1haW50YWluZXISFwoHYXBpX2tleRgIIAEoCVIGYXBpS2V5IiQKEkFQSUtleUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiPAoWQVBJS2V5TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIkChJBUElLZXlFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0FQSUtleURpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlsKE1NlZ21lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIiUKE1NlZ21lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIpcBChNTZWdtZW50VXBkYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIwCgRuYW1lGAIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbiI9ChdTZWdtZW50TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJSCh5TZWdtZW50RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiJUChVTZWdtZW50UnVsZUFkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEisKBHJ1bGUYAiABKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgRydWxlIkIKF1NlZ21lbnRSdWxlRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQiiAEKG1NlZ21lbnRSdWxlQ2xhdXNlQWRkZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgDIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlInQKHVNlZ21lbnRSdWxlQ2xhdXNlRGVsZXRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZCKXAQoiU2VnbWVudENsYXVzZUF0dHJpYnV0ZUNoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSHAoJYXR0cmlidXRlGAQgASgJUglhdHRyaWJ1dGUiuAEKIVNlZ21lbnRDbGF1c2VPcGVyYXRvckNoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSPgoIb3BlcmF0b3IYBCABKA4yIi5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yIokBChxTZWdtZW50Q2xhdXNlVmFsdWVBZGRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUiiwEKHlNlZ21lbnRDbGF1c2VWYWx1ZVJlbW92ZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSFAoFdmFsdWUYBCABKAlSBXZhbHVlIo0BChVTZWdtZW50VXNlckFkZGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhkKCHVzZXJfaWRzGAIgAygJUgd1c2VySWRzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlIo8BChdTZWdtZW50VXNlckRlbGV0ZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSGQoIdXNlcl9pZHMYAiADKAlSB3VzZXJJZHMSOgoFc3RhdGUYAyABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUiswEKG1NlZ21lbnRCdWxrVXBsb2FkVXNlcnNFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSOQoGc3RhdHVzGAIgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSLWAQooU2VnbWVudEJ1bGtVcGxvYWRVc2Vyc1N0YXR1c0NoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSOQoGc3RhdHVzGAIgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIUCgVjb3VudBgEIAEoA1IFY291bnQi9AEKF0Vudmlyb25tZW50Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIcCgluYW1lc3BhY2UYAiABKAlSCW5hbWVzcGFjZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSHQoKcHJvamVjdF9pZBgIIAEoCVIJcHJvamVjdElkIj0KF0Vudmlyb25tZW50UmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlYKIkVudmlyb25tZW50RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiJHChdFbnZpcm9ubWVudERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHAoJbmFtZXNwYWNlGAIgASgJUgluYW1lc3BhY2UingIKGUVudmlyb25tZW50VjJDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEh0KCnByb2plY3RfaWQYBSABKAlSCXByb2plY3RJZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBInCg9yZXF1aXJlX2NvbW1lbnQYCSABKAhSDnJlcXVpcmVDb21tZW50IoABChlFbnZpcm9ubWVudFYyUmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpwcm9qZWN0X2lkGAIgASgJUglwcm9qZWN0SWQSGQoIb2xkX25hbWUYAyABKAlSB29sZE5hbWUSGQoIbmV3X25hbWUYBCABKAlSB25ld05hbWUiuwEKJEVudmlyb25tZW50VjJEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQSJwoPb2xkX2Rlc2NyaXB0aW9uGAQgASgJUg5vbGREZXNjcmlwdGlvbhInCg9uZXdfZGVzY3JpcHRpb24YBSABKAlSDm5ld0Rlc2NyaXB0aW9uIpUBCidFbnZpcm9ubWVudFYyUmVxdWlyZUNvbW1lbnRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkEicKD3JlcXVpcmVfY29tbWVudBgEIAEoCFIOcmVxdWlyZUNvbW1lbnQiXwoaRW52aXJvbm1lbnRWMkFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkImEKHEVudmlyb25tZW50VjJVbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkIqkCChdBdXRvT3BzUnVsZUNyZWF0ZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNQoIb3BzX3R5cGUYAiABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlEjMKB2NsYXVzZXMYAyADKAsyGS5idWNrZXRlZXIuYXV0b29wcy5DbGF1c2VSB2NsYXVzZXMSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBI/CgpvcHNfc3RhdHVzGAcgASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1IJb3BzU3RhdHVzSgQIBBAFIhkKF0F1dG9PcHNSdWxlU3RvcHBlZEV2ZW50IhkKF0F1dG9PcHNSdWxlRGVsZXRlZEV2ZW50IlcKHkF1dG9PcHNSdWxlT3BzVHlwZUNoYW5nZWRFdmVudBI1CghvcHNfdHlwZRgBIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUiJAoiQXV0b09wc1J1bGVUcmlnZ2VyZWRBdENoYW5nZWRFdmVudCJjCiBBdXRvT3BzUnVsZU9wc1N0YXR1c0NoYW5nZWRFdmVudBI/CgpvcHNfc3RhdHVzGAEgASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1IJb3BzU3RhdHVzIpUBChxPcHNFdmVudFJhdGVDbGF1c2VBZGRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSWAoVb3BzX2V2ZW50X3JhdGVfY2xhdXNlGAIgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhJvcHNFdmVudFJhdGVDbGF1c2UilwEKHk9wc0V2ZW50UmF0ZUNsYXVzZUNoYW5nZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkElgKFW9wc19ldmVudF9yYXRlX2NsYXVzZRgCIAEoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVISb3BzRXZlbnRSYXRlQ2xhdXNlIjwKHUF1dG9PcHNSdWxlQ2xhdXNlRGVsZXRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQigwEKGERhdGV0aW1lQ2xhdXNlQWRkZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkEkoKD2RhdGV0aW1lX2NsYXVzZRgCIAEoCzIhLmJ1Y2tldGVlci5hdXRvb3BzLkRhdGV0aW1lQ2xhdXNlUg5kYXRldGltZUNsYXVzZSKFAQoaRGF0ZXRpbWVDbGF1c2VDaGFuZ2VkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZBJKCg9kYXRldGltZV9jbGF1c2UYAiABKAsyIS5idWNrZXRlZXIuYXV0b29wcy5EYXRldGltZUNsYXVzZVIOZGF0ZXRpbWVDbGF1c2UicAoQUHVzaENyZWF0ZWRFdmVudBIuChNmY21fc2VydmljZV9hY2NvdW50GAEgASgJUhFmY21TZXJ2aWNlQWNjb3VudBISCgR0YWdzGAMgAygJUgR0YWdzEhIKBG5hbWUYBCABKAlSBG5hbWVKBAgCEAMiEgoQUHVzaERlbGV0ZWRFdmVudCIoChJQdXNoVGFnc0FkZGVkRXZlbnQSEgoEdGFncxgCIAMoCVIEdGFncyIqChRQdXNoVGFnc0RlbGV0ZWRFdmVudBISCgR0YWdzGAIgAygJUgR0YWdzIiYKEFB1c2hSZW5hbWVkRXZlbnQSEgoEbmFtZRgCIAEoCVIEbmFtZSIqChRQdXNoVGFnc1VwZGF0ZWRFdmVudBISCgR0YWdzGAIgAygJUgR0YWdzIlgKEFB1c2hVcGRhdGVkRXZlbnQSMAoEbmFtZRgBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRISCgR0YWdzGAIgAygJUgR0YWdzIsMBChhTdWJzY3JpcHRpb25DcmVhdGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAIgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAMgASgJUgRuYW1lIhoKGFN1YnNjcmlwdGlvbkRlbGV0ZWRFdmVudCIaChhTdWJzY3JpcHRpb25FbmFibGVkRXZlbnQiGwoZU3Vic2NyaXB0aW9uRGlzYWJsZWRFdmVudCJ3CiFTdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0FkZGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMieQojU3Vic2NyaXB0aW9uU291cmNlVHlwZXNEZWxldGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiLgoYU3Vic2NyaXB0aW9uUmVuYW1lZEV2ZW50EhIKBG5hbWUYASABKAlSBG5hbWUi6AEKGFN1YnNjcmlwdGlvblVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSMAoEbmFtZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRJSCgxzb3VyY2VfdHlwZXMYAyADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI2CghkaXNhYmxlZBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkIsgBCh1BZG1pblN1YnNjcmlwdGlvbkNyZWF0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYAiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYAyABKAlSBG5hbWUiHwodQWRtaW5TdWJzY3JpcHRpb25EZWxldGVkRXZlbnQiHwodQWRtaW5TdWJzY3JpcHRpb25FbmFibGVkRXZlbnQiIAoeQWRtaW5TdWJzY3JpcHRpb25EaXNhYmxlZEV2ZW50InwKJkFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNBZGRlZEV2ZW50ElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIn4KKEFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNEZWxldGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiMwodQWRtaW5TdWJzY3JpcHRpb25SZW5hbWVkRXZlbnQSEgoEbmFtZRgBIAEoCVIEbmFtZSKLAgoTUHJvamVjdENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZSJSCh5Qcm9qZWN0RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiI5ChNQcm9qZWN0UmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIiUKE1Byb2plY3RFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiYKFFByb2plY3REaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCKQAgoYUHJvamVjdFRyaWFsQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYAyABKAhSCGRpc2FibGVkEhQKBXRyaWFsGAQgASgIUgV0cmlhbBIjCg1jcmVhdG9yX2VtYWlsGAUgASgJUgxjcmVhdG9yRW1haWwSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAggASgJUgRuYW1lEhkKCHVybF9jb2RlGAkgASgJUgd1cmxDb2RlIiwKGlByb2plY3RUcmlhbENvbnZlcnRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCJdChZQcmVyZXF1aXNpdGVBZGRlZEV2ZW50EkMKDHByZXJlcXVpc2l0ZRgBIAEoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVIMcHJlcmVxdWlzaXRlImgKIVByZXJlcXVpc2l0ZVZhcmlhdGlvbkNoYW5nZWRFdmVudBJDCgxwcmVyZXF1aXNpdGUYASABKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDHByZXJlcXVpc2l0ZSI5ChhQcmVyZXF1aXNpdGVSZW1vdmVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkIvsBCh5Qcm9ncmVzc2l2ZVJvbGxvdXRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIsCgZjbGF1c2UYAyABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2USHQoKY3JlYXRlZF9hdBgEIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBSABKANSCXVwZGF0ZWRBdBI+CgR0eXBlGAYgASgOMiouYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlR5cGVSBHR5cGUi5QEKHlByb2dyZXNzaXZlUm9sbG91dFN0b3BwZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSRAoGc3RhdHVzGAIgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c1IGc3RhdHVzEk4KCnN0b3BwZWRfYnkYAyABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkSHQoKc3RvcHBlZF9hdBgEIAEoA1IJc3RvcHBlZEF0IjAKHlByb2dyZXNzaXZlUm9sbG91dERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiVAoxUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGVUcmlnZ2VyZWRBdENoYW5nZWRFdmVudBIfCgtzY2hlZHVsZV9pZBgBIAEoCVIKc2NoZWR1bGVJZCKoAgoYT3JnYW5pemF0aW9uQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgFIAEoCFIIZGlzYWJsZWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEhQKBXRyaWFsGAcgASgIUgV0cmlhbBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0Eh8KC293bmVyX2VtYWlsGAogASgJUgpvd25lckVtYWlsIlcKI09yZ2FuaXphdGlvbkRlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iVQoiT3JnYW5pemF0aW9uT3duZXJFbWFpbENoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHwoLb3duZXJfZW1haWwYAiABKAlSCm93bmVyRW1haWwiQgocT3JnYW5pemF0aW9uTmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIqChhPcmdhbml6YXRpb25FbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIisKGU9yZ2FuaXphdGlvbkRpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIisKGU9yZ2FuaXphdGlvbkFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIi0KG09yZ2FuaXphdGlvblVuYXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiMQofT3JnYW5pemF0aW9uVHJpYWxDb252ZXJ0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQi4wIKF0ZsYWdUcmlnZ2VyQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhQKBXRva2VuGAcgASgJUgV0b2tlbhIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGAogASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIokBChVGbGFnVHJpZ2dlclJlc2V0RXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIUCgV0b2tlbhgEIAEoCVIFdG9rZW4SJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiogEKIkZsYWdUcmlnZ2VyRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQidgoYRmxhZ1RyaWdnZXJEaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQidQoXRmxhZ1RyaWdnZXJFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCJ1ChdGbGFnVHJpZ2dlckRlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIssBChxGbGFnVHJpZ2dlclVzYWdlVXBkYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSKgoRbGFzdF90cmlnZ2VyZWRfYXQYBCABKANSD2xhc3RUcmlnZ2VyZWRBdBIjCg10cmlnZ2VyX3RpbWVzGAUgASgFUgx0cmlnZ2VyVGltZXMSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiVQoeQWNjb3VudFYyRmlyc3ROYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIdCgpmaXJzdF9uYW1lGAIgASgJUglmaXJzdE5hbWUiUgodQWNjb3VudFYyTGFzdE5hbWVDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsEhsKCWxhc3RfbmFtZRgCIAEoCVIIbGFzdE5hbWUiUQodQWNjb3VudFYyTGFuZ3VhZ2VDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsEhoKCGxhbmd1YWdlGAIgASgJUghsYW5ndWFnZSLaAQoPVGFnQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmNyZWF0ZWRfYXQYAyABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAQgASgDUgl1cGRhdGVkQXQSPgoLZW50aXR5X3R5cGUYBSABKA4yHS5idWNrZXRlZXIudGFnLlRhZy5FbnRpdHlUeXBlUgplbnRpdHlUeXBlEiUKDmVudmlyb25tZW50X2lkGAYgASgJUg1lbnZpcm9ubWVudElkIkgKD1RhZ0RlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWRCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2RvbWFpbmIGcHJvdG8zCsoBCipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5kb21haW4iRAoQTG9jYWxpemVkTWVzc2FnZRIWCgZsb2NhbGUYASABKAlSBmxvY2FsZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudC9kb21haW5iBnByb3RvMwr6BQodcHJvdG8vYXVkaXRsb2cvYXVkaXRsb2cucHJvdG8SEmJ1Y2tldGVlci5hdWRpdGxvZxoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bxoecHJvdG8vZXZlbnQvZG9tYWluL2V2ZW50LnByb3RvGipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8ioQQKCEF1ZGl0TG9nEg4KAmlkGAEgASgJUgJpZBIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBJJCgtlbnRpdHlfdHlwZRgDIAEoDjIoLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIbCgllbnRpdHlfaWQYBCABKAlSCGVudGl0eUlkEjYKBHR5cGUYBSABKA4yIi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LlR5cGVSBHR5cGUSKgoFZXZlbnQYBiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBI2CgZlZGl0b3IYByABKAsyHi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkVkaXRvclIGZWRpdG9yEjkKB29wdGlvbnMYCCABKAsyHy5idWNrZXRlZXIuZXZlbnQuZG9tYWluLk9wdGlvbnNSB29wdGlvbnMSVQoRbG9jYWxpemVkX21lc3NhZ2UYCSABKAsyKC5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkxvY2FsaXplZE1lc3NhZ2VSEGxvY2FsaXplZE1lc3NhZ2USHwoLZW50aXR5X2RhdGEYCiABKAlSCmVudGl0eURhdGESMAoUcHJldmlvdXNfZW50aXR5X2RhdGEYCyABKAlSEnByZXZpb3VzRW50aXR5RGF0YUIyWjBnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXVkaXRsb2diBnByb3RvMwqgEwoccHJvdG8vYXVkaXRsb2cvc2VydmljZS5wcm90bxISYnVja2V0ZWVyLmF1ZGl0bG9nGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aHXByb3RvL2F1ZGl0bG9nL2F1ZGl0bG9nLnByb3RvIvwDChRMaXN0QXVkaXRMb2dzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEksKCG9yZGVyX2J5GAQgASgOMjAuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSYAoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMjcuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBISCgRmcm9tGAcgASgDUgRmcm9tEg4KAnRvGAggASgDUgJ0bxI8CgtlbnRpdHlfdHlwZRgJIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgplbnRpdHlUeXBlEiUKDmVudmlyb25tZW50X2lkGAogASgJUg1lbnZpcm9ubWVudElkIiUKB09yZGVyQnkSCwoHREVGQVVMVBAAEg0KCVRJTUVTVEFNUBABIiMKDk9yZGVyRGlyZWN0aW9uEggKBERFU0MQABIHCgNBU0MQAUoECAMQBCKNAQoVTGlzdEF1ZGl0TG9nc1Jlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCLeAwoZTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yElAKCG9yZGVyX2J5GAMgASgOMjUuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJlCg9vcmRlcl9kaXJlY3Rpb24YBCABKA4yPC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBSABKAlSDXNlYXJjaEtleXdvcmQSEgoEZnJvbRgGIAEoA1IEZnJvbRIOCgJ0bxgHIAEoA1ICdG8SPAoLZW50aXR5X3R5cGUYCCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIKZW50aXR5VHlwZSIlCgdPcmRlckJ5EgsKB0RFRkFVTFQQABINCglUSU1FU1RBTVAQASIjCg5PcmRlckRpcmVjdGlvbhIICgRERVNDEAASBwoDQVNDEAEikgEKGkxpc3RBZG1pbkF1ZGl0TG9nc1Jlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCLsAwoZTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchJQCghvcmRlcl9ieRgFIAEoDjI1LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSZQoPb3JkZXJfZGlyZWN0aW9uGAYgASgOMjwuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RGZWF0dXJlSGlzdG9yeVJlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAcgASgJUg1zZWFyY2hLZXl3b3JkEhIKBGZyb20YCCABKANSBGZyb20SDgoCdG8YCSABKANSAnRvEiUKDmVudmlyb25tZW50X2lkGAogASgJUg1lbnZpcm9ubWVudElkIiUKB09yZGVyQnkSCwoHREVGQVVMVBAAEg0KCVRJTUVTVEFNUBABIiMKDk9yZGVyRGlyZWN0aW9uEggKBERFU0MQABIHCgNBU0MQAUoECAQQBSKSAQoaTGlzdEZlYXR1cmVIaXN0b3J5UmVzcG9uc2USOwoKYXVkaXRfbG9ncxgBIAMoCzIcLmJ1Y2tldGVlci5hdWRpdGxvZy5BdWRpdExvZ1IJYXVkaXRMb2dzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50MucCCg9BdWRpdExvZ1NlcnZpY2USZgoNTGlzdEF1ZGl0TG9ncxIoLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QXVkaXRMb2dzUmVxdWVzdBopLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QXVkaXRMb2dzUmVzcG9uc2UiABJ1ChJMaXN0QWRtaW5BdWRpdExvZ3MSLS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdBouLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QWRtaW5BdWRpdExvZ3NSZXNwb25zZSIAEnUKEkxpc3RGZWF0dXJlSGlzdG9yeRItLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXF1ZXN0Gi4uYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RGZWF0dXJlSGlzdG9yeVJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1ZGl0bG9nYgZwcm90bzM=
+ auditlogDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKxwMKGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSLaAgoGQ2xhdXNlEg4KAmlkGAEgASgJUgJpZBIcCglhdHRyaWJ1dGUYAiABKAlSCWF0dHJpYnV0ZRI+CghvcGVyYXRvchgDIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3ISFgoGdmFsdWVzGAQgAygJUgZ2YWx1ZXMiyQEKCE9wZXJhdG9yEgoKBkVRVUFMUxAAEgYKAklOEAESDQoJRU5EU19XSVRIEAISDwoLU1RBUlRTX1dJVEgQAxILCgdTRUdNRU5UEAQSCwoHR1JFQVRFUhAFEhQKEEdSRUFURVJfT1JfRVFVQUwQBhIICgRMRVNTEAcSEQoNTEVTU19PUl9FUVVBTBAIEgoKBkJFRk9SRRAJEgkKBUFGVEVSEAoSEAoMRkVBVFVSRV9GTEFHEAsSEwoPUEFSVElBTExZX01BVENIEAxCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq7BAoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiLQoNRml4ZWRTdHJhdGVneRIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbiKiAQoPUm9sbG91dFN0cmF0ZWd5EkwKCnZhcmlhdGlvbnMYASADKAsyLC5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3kuVmFyaWF0aW9uUgp2YXJpYXRpb25zGkEKCVZhcmlhdGlvbhIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIWCgZ3ZWlnaHQYAiABKAVSBndlaWdodCL4AQoIU3RyYXRlZ3kSNAoEdHlwZRgBIAEoDjIgLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5LlR5cGVSBHR5cGUSRwoOZml4ZWRfc3RyYXRlZ3kYAiABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5Ug1maXhlZFN0cmF0ZWd5Ek0KEHJvbGxvdXRfc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSD3JvbGxvdXRTdHJhdGVneSIeCgRUeXBlEgkKBUZJWEVEEAASCwoHUk9MTE9VVBABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqQIKGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvIoQBCgRSdWxlEg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgdjbGF1c2VzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqAEKGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSI8CgZUYXJnZXQSHAoJdmFyaWF0aW9uGAEgASgJUgl2YXJpYXRpb24SFAoFdXNlcnMYAiADKAlSBXVzZXJzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvQCCipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIvcBChNGZWF0dXJlTGFzdFVzZWRJbmZvEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uEiAKDGxhc3RfdXNlZF9hdBgDIAEoA1IKbGFzdFVzZWRBdBIdCgpjcmVhdGVkX2F0GAQgASgDUgljcmVhdGVkQXQSMgoVY2xpZW50X29sZGVzdF92ZXJzaW9uGAUgASgJUhNjbGllbnRPbGRlc3RWZXJzaW9uEjIKFWNsaWVudF9sYXRlc3RfdmVyc2lvbhgGIAEoCVITY2xpZW50TGF0ZXN0VmVyc2lvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCsIBCiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiUAoMUHJlcmVxdWlzaXRlEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKswwKG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvItIHCgdGZWF0dXJlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdlbmFibGVkGAQgASgIUgdlbmFibGVkEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSOQoWZXZhbHVhdGlvbl91bmRlbGF5YWJsZRgGIAEoCEICGAFSFWV2YWx1YXRpb25VbmRlbGF5YWJsZRIQCgN0dGwYByABKAVSA3R0bBIYCgd2ZXJzaW9uGAggASgFUgd2ZXJzaW9uEh0KCmNyZWF0ZWRfYXQYCSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAogASgDUgl1cGRhdGVkQXQSPAoKdmFyaWF0aW9ucxgLIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGA0gAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgOIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgPIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYECADKAlSBHRhZ3MSTAoObGFzdF91c2VkX2luZm8YESABKAsyJi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlTGFzdFVzZWRJbmZvUgxsYXN0VXNlZEluZm8SHgoKbWFpbnRhaW5lchgSIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgTIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRIaCghhcmNoaXZlZBgUIAEoCFIIYXJjaGl2ZWQSRQoNcHJlcmVxdWlzaXRlcxgVIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIjCg1zYW1wbGluZ19zZWVkGBYgASgJUgxzYW1wbGluZ1NlZWQiPgoNVmFyaWF0aW9uVHlwZRIKCgZTVFJJTkcQABILCgdCT09MRUFOEAESCgoGTlVNQkVSEAISCAoESlNPThADIlIKCEZlYXR1cmVzEjYKCGZlYXR1cmVzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMSDgoCaWQYAiABKAlSAmlkInMKEkVudmlyb25tZW50RmVhdHVyZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBI2CghmZWF0dXJlcxgCIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzImcKA1RhZxIOCgJpZBgBIAEoCVICaWQSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAQgASgJUgRuYW1lQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKtQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiggEKDFNlZ21lbnRVc2VycxIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSNAoFdXNlcnMYAiADKAsyHi5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlclIFdXNlcnMSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK5wMKI3Byb3RvL2Vudmlyb25tZW50L2Vudmlyb25tZW50LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQi6QIKDUVudmlyb25tZW50VjISDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEh0KCnByb2plY3RfaWQYBSABKAlSCXByb2plY3RJZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBInCg9vcmdhbml6YXRpb25faWQYCSABKAlSDm9yZ2FuaXphdGlvbklkEicKD3JlcXVpcmVfY29tbWVudBgKIAEoCFIOcmVxdWlyZUNvbW1lbnQSLAoSZmVhdHVyZV9mbGFnX2NvdW50GAsgASgFUhBmZWF0dXJlRmxhZ0NvdW50QjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCv0DCh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQigwMKB1Byb2plY3QSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUSJwoPb3JnYW5pemF0aW9uX2lkGAogASgJUg5vcmdhbml6YXRpb25JZBIrChFlbnZpcm9ubWVudF9jb3VudBgLIAEoBVIQZW52aXJvbm1lbnRDb3VudBIsChJmZWF0dXJlX2ZsYWdfY291bnQYDCABKAVSEGZlYXR1cmVGbGFnQ291bnRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKrwQKJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IrADCgxPcmdhbml6YXRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSFAoFdHJpYWwYByABKAhSBXRyaWFsEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQSIQoMc3lzdGVtX2FkbWluGAogASgIUgtzeXN0ZW1BZG1pbhIjCg1wcm9qZWN0X2NvdW50GAsgASgFUgxwcm9qZWN0Q291bnQSKwoRZW52aXJvbm1lbnRfY291bnQYDCABKAVSEGVudmlyb25tZW50Q291bnQSHQoKdXNlcl9jb3VudBgNIAEoBVIJdXNlckNvdW50Eh8KC293bmVyX2VtYWlsGA4gASgJUgpvd25lckVtYWlsQjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCpADCiFwcm90by9hY2NvdW50L3NlYXJjaF9maWx0ZXIucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50IukBCgxTZWFyY2hGaWx0ZXISDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFcXVlcnkYAyABKAlSBXF1ZXJ5ElEKEmZpbHRlcl90YXJnZXRfdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5hY2NvdW50LkZpbHRlclRhcmdldFR5cGVSEGZpbHRlclRhcmdldFR5cGUSJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWQSJQoOZGVmYXVsdF9maWx0ZXIYBiABKAhSDWRlZmF1bHRGaWx0ZXIqMQoQRmlsdGVyVGFyZ2V0VHlwZRILCgdVTktOT1dOEAASEAoMRkVBVFVSRV9GTEFHEAFCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwrUEwobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8aH3Byb3RvL2Vudmlyb25tZW50L3Byb2plY3QucHJvdG8aJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxohcHJvdG8vYWNjb3VudC9zZWFyY2hfZmlsdGVyLnByb3RvIqsCCgdBY2NvdW50Eg4KAmlkGAEgASgJUgJpZBIUCgVlbWFpbBgCIAEoCVIFZW1haWwSEgoEbmFtZRgDIAEoCVIEbmFtZRIzCgRyb2xlGAQgASgOMh8uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudC5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCCABKAhSB2RlbGV0ZWQiOQoEUm9sZRIKCgZWSUVXRVIQABIKCgZFRElUT1IQARIJCgVPV05FUhACEg4KClVOQVNTSUdORUQQYzoCGAEivAgKCUFjY291bnRWMhIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBJGCg5zZWFyY2hfZmlsdGVycxgKIAMoCzIfLmJ1Y2tldGVlci5hY2NvdW50LlNlYXJjaEZpbHRlclINc2VhcmNoRmlsdGVycxIdCgpmaXJzdF9uYW1lGAsgASgJUglmaXJzdE5hbWUSGwoJbGFzdF9uYW1lGAwgASgJUghsYXN0TmFtZRIaCghsYW5ndWFnZRgNIAEoCVIIbGFuZ3VhZ2USGwoJbGFzdF9zZWVuGA4gASgDUghsYXN0U2VlbhIoChBhdmF0YXJfZmlsZV90eXBlGA8gASgJUg5hdmF0YXJGaWxlVHlwZRIhCgxhdmF0YXJfaW1hZ2UYECABKAxSC2F2YXRhckltYWdlEisKEWVudmlyb25tZW50X2NvdW50GBEgASgFUhBlbnZpcm9ubWVudENvdW50EhIKBHRhZ3MYEiADKAlSBHRhZ3Ma1wEKBFJvbGUiWQoLRW52aXJvbm1lbnQSGgoWRW52aXJvbm1lbnRfVU5BU1NJR05FRBAAEhYKEkVudmlyb25tZW50X1ZJRVdFUhABEhYKEkVudmlyb25tZW50X0VESVRPUhACInQKDE9yZ2FuaXphdGlvbhIbChdPcmdhbml6YXRpb25fVU5BU1NJR05FRBAAEhcKE09yZ2FuaXphdGlvbl9NRU1CRVIQARIWChJPcmdhbml6YXRpb25fQURNSU4QAhIWChJPcmdhbml6YXRpb25fT1dORVIQAxp7Cg9FbnZpcm9ubWVudFJvbGUSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSQQoEcm9sZRgCIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLkVudmlyb25tZW50UgRyb2xlIuoGCg5Db25zb2xlQWNjb3VudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgphdmF0YXJfdXJsGAMgASgJUglhdmF0YXJVcmwSJgoPaXNfc3lzdGVtX2FkbWluGAQgASgIUg1pc1N5c3RlbUFkbWluEkcKDG9yZ2FuaXphdGlvbhgFIAEoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDG9yZ2FuaXphdGlvbhJbChFvcmdhbml6YXRpb25fcm9sZRgGIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJeChFlbnZpcm9ubWVudF9yb2xlcxgHIAMoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNvbnNvbGVBY2NvdW50LkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxJGCg5zZWFyY2hfZmlsdGVycxgIIAMoCzIfLmJ1Y2tldGVlci5hY2NvdW50LlNlYXJjaEZpbHRlclINc2VhcmNoRmlsdGVycxIdCgpmaXJzdF9uYW1lGAkgASgJUglmaXJzdE5hbWUSGwoJbGFzdF9uYW1lGAogASgJUghsYXN0TmFtZRIaCghsYW5ndWFnZRgLIAEoCVIIbGFuZ3VhZ2USKAoQYXZhdGFyX2ZpbGVfdHlwZRgMIAEoCVIOYXZhdGFyRmlsZVR5cGUSIQoMYXZhdGFyX2ltYWdlGA0gASgMUgthdmF0YXJJbWFnZRIbCglsYXN0X3NlZW4YDiABKANSCGxhc3RTZWVuGtYBCg9FbnZpcm9ubWVudFJvbGUSRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSOAoHcHJvamVjdBgCIAEoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ugdwcm9qZWN0EkEKBHJvbGUYAyABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5FbnZpcm9ubWVudFIEcm9sZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCuYGChtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90byK7AwoGQVBJS2V5Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEjIKBHJvbGUYAyABKA4yHi5idWNrZXRlZXIuYWNjb3VudC5BUElLZXkuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgEIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBIeCgptYWludGFpbmVyGAcgASgJUgptYWludGFpbmVyEhcKB2FwaV9rZXkYCCABKAlSBmFwaUtleRIgCgtkZXNjcmlwdGlvbhgJIAEoCVILZGVzY3JpcHRpb24SKQoQZW52aXJvbm1lbnRfbmFtZRgKIAEoCVIPZW52aXJvbm1lbnROYW1lInkKBFJvbGUSCwoHVU5LTk9XThAAEg4KClNES19DTElFTlQQARIOCgpTREtfU0VSVkVSEAISGAoUUFVCTElDX0FQSV9SRUFEX09OTFkQAxIUChBQVUJMSUNfQVBJX1dSSVRFEAQSFAoQUFVCTElDX0FQSV9BRE1JThAFIpUCChFFbnZpcm9ubWVudEFQSUtleRIyCgdhcGlfa2V5GAIgASgLMhkuYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5UgZhcGlLZXkSMQoUZW52aXJvbm1lbnRfZGlzYWJsZWQYAyABKAhSE2Vudmlyb25tZW50RGlzYWJsZWQSIQoKcHJvamVjdF9pZBgEIAEoCUICGAFSCXByb2plY3RJZBJGCgtlbnZpcm9ubWVudBgFIAEoCzIkLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFYyUgtlbnZpcm9ubWVudBIoChBwcm9qZWN0X3VybF9jb2RlGAYgASgJUg5wcm9qZWN0VXJsQ29kZUoECAEQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCpoLChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8ihgEKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEj4KC2FjdGlvbl90eXBlGAMgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSLfAgoST3BzRXZlbnRSYXRlQ2xhdXNlEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQSFwoHZ29hbF9pZBgDIAEoCVIGZ29hbElkEhsKCW1pbl9jb3VudBgEIAEoA1IIbWluQ291bnQSKQoQdGhyZWFkc2hvbGRfcmF0ZRgFIAEoAVIPdGhyZWFkc2hvbGRSYXRlEkoKCG9wZXJhdG9yGAYgASgOMi4uYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchI+CgthY3Rpb25fdHlwZRgHIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiJkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lEj4KC2FjdGlvbl90eXBlGAIgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADKjIKCkFjdGlvblR5cGUSCwoHVU5LTk9XThAAEgoKBkVOQUJMRRABEgsKB0RJU0FCTEUQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCr0FCiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90byLQAgoLQXV0b09wc1J1bGUSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgDIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgEIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQSSAoPYXV0b19vcHNfc3RhdHVzGAogASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1INYXV0b09wc1N0YXR1c0oECAYQByJUCgxBdXRvT3BzUnVsZXMSRAoOYXV0b19vcHNfcnVsZXMYASADKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVIMYXV0b09wc1J1bGVzKj8KB09wc1R5cGUSEAoMVFlQRV9VTktOT1dOEAASDAoIU0NIRURVTEUQAhIOCgpFVkVOVF9SQVRFEAMiBAgBEAEqRAoNQXV0b09wc1N0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK8AMKInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24itwIKCVJlY2lwaWVudBI6CgR0eXBlGAEgASgOMiYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnQuVHlwZVIEdHlwZRJlChdzbGFja19jaGFubmVsX3JlY2lwaWVudBgCIAEoCzItLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU2xhY2tDaGFubmVsUmVjaXBpZW50UhVzbGFja0NoYW5uZWxSZWNpcGllbnQSRgoIbGFuZ3VhZ2UYAyABKA4yKi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudC5MYW5ndWFnZVIIbGFuZ3VhZ2UiGAoEVHlwZRIQCgxTbGFja0NoYW5uZWwQACIlCghMYW5ndWFnZRILCgdFTkdMSVNIEAASDAoISkFQQU5FU0UQASI4ChVTbGFja0NoYW5uZWxSZWNpcGllbnQSHwoLd2ViaG9va191cmwYASABKAlSCndlYmhvb2tVcmxCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCv8ICiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvEhZidWNrZXRlZXIubm90aWZpY2F0aW9uGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvItkHCgxTdWJzY3JpcHRpb24SDgoCaWQYASABKAlSAmlkEh0KCmNyZWF0ZWRfYXQYAiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAMgASgDUgl1cGRhdGVkQXQSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkElIKDHNvdXJjZV90eXBlcxgFIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEj8KCXJlY2lwaWVudBgGIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50UglyZWNpcGllbnQSEgoEbmFtZRgHIAEoCVIEbmFtZRIlCg5lbnZpcm9ubWVudF9pZBgIIAEoCVINZW52aXJvbm1lbnRJZBIpChBlbnZpcm9ubWVudF9uYW1lGAkgASgJUg9lbnZpcm9ubWVudE5hbWUi4wQKClNvdXJjZVR5cGUSGAoURE9NQUlOX0VWRU5UX0ZFQVRVUkUQABIVChFET01BSU5fRVZFTlRfR09BTBABEhsKF0RPTUFJTl9FVkVOVF9FWFBFUklNRU5UEAISGAoURE9NQUlOX0VWRU5UX0FDQ09VTlQQAxIXChNET01BSU5fRVZFTlRfQVBJS0VZEAQSGAoURE9NQUlOX0VWRU5UX1NFR01FTlQQBRIcChhET01BSU5fRVZFTlRfRU5WSVJPTk1FTlQQBhIeChpET01BSU5fRVZFTlRfQURNSU5fQUNDT1VOVBAHEh0KGURPTUFJTl9FVkVOVF9BVVRPT1BTX1JVTEUQCBIVChFET01BSU5fRVZFTlRfUFVTSBAJEh0KGURPTUFJTl9FVkVOVF9TVUJTQ1JJUFRJT04QChIjCh9ET01BSU5fRVZFTlRfQURNSU5fU1VCU0NSSVBUSU9OEAsSGAoURE9NQUlOX0VWRU5UX1BST0pFQ1QQDBIYChRET01BSU5fRVZFTlRfV0VCSE9PSxANEiQKIERPTUFJTl9FVkVOVF9QUk9HUkVTU0lWRV9ST0xMT1VUEA4SHQoZRE9NQUlOX0VWRU5UX09SR0FOSVpBVElPThAPEh0KGURPTUFJTl9FVkVOVF9GTEFHX1RSSUdHRVIQEBIUChBET01BSU5fRVZFTlRfVEFHEBESGAoURE9NQUlOX0VWRU5UX0NPREVSRUYQEhIRCg1GRUFUVVJFX1NUQUxFEGQSFwoSRVhQRVJJTUVOVF9SVU5OSU5HEMgBEg4KCU1BVV9DT1VOVBCsAkI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vbm90aWZpY2F0aW9uYgZwcm90bzMK9wUKJ3Byb3RvL2F1dG9vcHMvcHJvZ3Jlc3NpdmVfcm9sbG91dC5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8i4gQKElByb2dyZXNzaXZlUm9sbG91dBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEiwKBmNsYXVzZRgDIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBmNsYXVzZRJECgZzdGF0dXMYBCABKA4yLC5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RhdHVzUgZzdGF0dXMSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBI+CgR0eXBlGAcgASgOMiouYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlR5cGVSBHR5cGUSTgoKc3RvcHBlZF9ieRgIIAEoDjIvLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdG9wcGVkQnlSCXN0b3BwZWRCeRIdCgpzdG9wcGVkX2F0GAkgASgDUglzdG9wcGVkQXQiMgoEVHlwZRITCg9NQU5VQUxfU0NIRURVTEUQABIVChFURU1QTEFURV9TQ0hFRFVMRRABIj0KBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAISCwoHU1RPUFBFRBADIkkKCVN0b3BwZWRCeRILCgdVTktOT1dOEAASCAoEVVNFUhABEhAKDE9QU19TQ0hFRFVMRRACEhMKD09QU19LSUxMX1NXSVRDSBADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMKoAUKIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSKtBAoLRmxhZ1RyaWdnZXISDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI3CgR0eXBlGAQgASgOMiMuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuVHlwZVIEdHlwZRI9CgZhY3Rpb24YBSABKA4yJS5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlci5BY3Rpb25SBmFjdGlvbhIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SIwoNdHJpZ2dlcl9jb3VudBgHIAEoBVIMdHJpZ2dlckNvdW50EioKEWxhc3RfdHJpZ2dlcmVkX2F0GAggASgDUg9sYXN0VHJpZ2dlcmVkQXQSFAoFdG9rZW4YCSABKAlSBXRva2VuEhoKCGRpc2FibGVkGAogASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAsgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgMIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkIioKBFR5cGUSEAoMVHlwZV9VTktOT1dOEAASEAoMVHlwZV9XRUJIT09LEAEiOwoGQWN0aW9uEhIKDkFjdGlvbl9VTktOT1dOEAASDQoJQWN0aW9uX09OEAESDgoKQWN0aW9uX09GRhACSgQIAxAEQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKywMKE3Byb3RvL3RhZy90YWcucHJvdG8SDWJ1Y2tldGVlci50YWcijAIKA1RhZxIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgEIAEoA1IJdXBkYXRlZEF0Ej4KC2VudGl0eV90eXBlGAUgASgOMh0uYnVja2V0ZWVyLnRhZy5UYWcuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZCI8CgpFbnRpdHlUeXBlEg8KC1VOU1BFQ0lGSUVEEAASEAoMRkVBVFVSRV9GTEFHEAESCwoHQUNDT1VOVBACIl8KDkVudmlyb25tZW50VGFnEiUKDmVudmlyb25tZW50X2lkGAEgASgJUg1lbnZpcm9ubWVudElkEiYKBHRhZ3MYAiADKAsyEi5idWNrZXRlZXIudGFnLlRhZ1IEdGFnc0ItWitnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vdGFnYgZwcm90bzMKtwgKIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90bxIUYnVja2V0ZWVyLmV4cGVyaW1lbnQaHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvIssGCgpFeHBlcmltZW50Eg4KAmlkGAEgASgJUgJpZBIbCgdnb2FsX2lkGAIgASgJQgIYAVIGZ29hbElkEh0KCmZlYXR1cmVfaWQYAyABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBCABKAVSDmZlYXR1cmVWZXJzaW9uEjwKCnZhcmlhdGlvbnMYBSADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSGQoIc3RhcnRfYXQYBiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgHIAEoA1IGc3RvcEF0EhwKB3N0b3BwZWQYCCABKAhCAhgBUgdzdG9wcGVkEiEKCnN0b3BwZWRfYXQYCSABKANCAjABUglzdG9wcGVkQXQSHQoKY3JlYXRlZF9hdBgKIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCyABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAwgASgIUgdkZWxldGVkEhkKCGdvYWxfaWRzGA0gAygJUgdnb2FsSWRzEhIKBG5hbWUYDiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YDyABKAlSC2Rlc2NyaXB0aW9uEioKEWJhc2VfdmFyaWF0aW9uX2lkGBAgASgJUg9iYXNlVmFyaWF0aW9uSWQSPwoGc3RhdHVzGBIgASgOMicuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudC5TdGF0dXNSBnN0YXR1cxIeCgptYWludGFpbmVyGBMgASgJUgptYWludGFpbmVyEhoKCGFyY2hpdmVkGBQgASgIUghhcmNoaXZlZBJECgVnb2FscxgVIAMoCzIuLmJ1Y2tldGVlci5leHBlcmltZW50LkV4cGVyaW1lbnQuR29hbFJlZmVyZW5jZVIFZ29hbHMaMwoNR29hbFJlZmVyZW5jZRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJCCgZTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARILCgdTVE9QUEVEEAISEQoNRk9SQ0VfU1RPUFBFRBADSgQIERASIlEKC0V4cGVyaW1lbnRzEkIKC2V4cGVyaW1lbnRzGAEgAygLMiAuYnVja2V0ZWVyLmV4cGVyaW1lbnQuRXhwZXJpbWVudFILZXhwZXJpbWVudHNCNFoyZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V4cGVyaW1lbnRiBnByb3RvMwq/BQobcHJvdG8vZXhwZXJpbWVudC9nb2FsLnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudBohcHJvdG8vZXhwZXJpbWVudC9leHBlcmltZW50LnByb3RvGiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8ihQQKBEdvYWwSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlbGV0ZWQYBCABKAhSB2RlbGV0ZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBInChBpc19pbl91c2Vfc3RhdHVzGAcgASgIUg1pc0luVXNlU3RhdHVzEhoKCGFyY2hpdmVkGAggASgIUghhcmNoaXZlZBJSCg9jb25uZWN0aW9uX3R5cGUYCSABKA4yKS5idWNrZXRlZXIuZXhwZXJpbWVudC5Hb2FsLkNvbm5lY3Rpb25UeXBlUg5jb25uZWN0aW9uVHlwZRJCCgtleHBlcmltZW50cxgKIAMoCzIgLmJ1Y2tldGVlci5leHBlcmltZW50LkV4cGVyaW1lbnRSC2V4cGVyaW1lbnRzEkQKDmF1dG9fb3BzX3J1bGVzGAsgAygLMh4uYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1J1bGVSDGF1dG9PcHNSdWxlcyI8Cg5Db25uZWN0aW9uVHlwZRILCgdVTktOT1dOEAASDgoKRVhQRVJJTUVOVBABEg0KCU9QRVJBVElPThACQjRaMmdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9leHBlcmltZW50YgZwcm90bzMKtwYKInByb3RvL2NvZGVyZWYvY29kZV9yZWZlcmVuY2UucHJvdG8SEWJ1Y2tldGVlci5jb2RlcmVmIsIFCg1Db2RlUmVmZXJlbmNlEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSGwoJZmlsZV9wYXRoGAMgASgJUghmaWxlUGF0aBIfCgtsaW5lX251bWJlchgEIAEoBVIKbGluZU51bWJlchIhCgxjb2RlX3NuaXBwZXQYBSABKAlSC2NvZGVTbmlwcGV0EiEKDGNvbnRlbnRfaGFzaBgGIAEoCVILY29udGVudEhhc2gSGAoHYWxpYXNlcxgHIAMoCVIHYWxpYXNlcxInCg9yZXBvc2l0b3J5X25hbWUYCCABKAlSDnJlcG9zaXRvcnlOYW1lEikKEHJlcG9zaXRvcnlfb3duZXIYCSABKAlSD3JlcG9zaXRvcnlPd25lchJYCg9yZXBvc2l0b3J5X3R5cGUYCiABKA4yLy5idWNrZXRlZXIuY29kZXJlZi5Db2RlUmVmZXJlbmNlLlJlcG9zaXRvcnlUeXBlUg5yZXBvc2l0b3J5VHlwZRIrChFyZXBvc2l0b3J5X2JyYW5jaBgLIAEoCVIQcmVwb3NpdG9yeUJyYW5jaBIfCgtjb21taXRfaGFzaBgMIAEoCVIKY29tbWl0SGFzaBIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZBIdCgpjcmVhdGVkX2F0GA4gASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgPIAEoA1IJdXBkYXRlZEF0Eh0KCnNvdXJjZV91cmwYECABKAlSCXNvdXJjZVVybCJkCg5SZXBvc2l0b3J5VHlwZRIfChtSRVBPU0lUT1JZX1RZUEVfVU5TUEVDSUZJRUQQABIKCgZHSVRIVUIQARIKCgZHSVRMQUIQAhINCglCSVRCVUNLRVQQAxIKCgZDVVNUT00QBEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vY29kZXJlZmIGcHJvdG8zCovXAQoecHJvdG8vZXZlbnQvZG9tYWluL2V2ZW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnQuZG9tYWluGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8aGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aHHByb3RvL2ZlYXR1cmUvc3RyYXRlZ3kucHJvdG8aG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvGiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8aGnByb3RvL2F1dG9vcHMvY2xhdXNlLnByb3RvGiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvGiBwcm90by9mZWF0dXJlL2ZsYWdfdHJpZ2dlci5wcm90bxohcHJvdG8vYWNjb3VudC9zZWFyY2hfZmlsdGVyLnByb3RvGhNwcm90by90YWcvdGFnLnByb3RvGhtwcm90by9leHBlcmltZW50L2dvYWwucHJvdG8aInByb3RvL2NvZGVyZWYvY29kZV9yZWZlcmVuY2UucHJvdG8i9i8KBUV2ZW50Eg4KAmlkGAEgASgJUgJpZBIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBJJCgtlbnRpdHlfdHlwZRgDIAEoDjIoLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIbCgllbnRpdHlfaWQYBCABKAlSCGVudGl0eUlkEjYKBHR5cGUYBSABKA4yIi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LlR5cGVSBHR5cGUSNgoGZWRpdG9yGAYgASgLMh4uYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FZGl0b3JSBmVkaXRvchIoCgRkYXRhGAcgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIEZGF0YRIkCg5pc19hZG1pbl9ldmVudBgJIAEoCFIMaXNBZG1pbkV2ZW50EjkKB29wdGlvbnMYCiABKAsyHy5idWNrZXRlZXIuZXZlbnQuZG9tYWluLk9wdGlvbnNSB29wdGlvbnMSHwoLZW50aXR5X2RhdGEYCyABKAlSCmVudGl0eURhdGESMAoUcHJldmlvdXNfZW50aXR5X2RhdGEYDCABKAlSEnByZXZpb3VzRW50aXR5RGF0YRIlCg5lbnZpcm9ubWVudF9pZBgNIAEoCVINZW52aXJvbm1lbnRJZCKpAgoKRW50aXR5VHlwZRILCgdGRUFUVVJFEAASCAoER09BTBABEg4KCkVYUEVSSU1FTlQQAhILCgdBQ0NPVU5UEAMSCgoGQVBJS0VZEAQSCwoHU0VHTUVOVBAFEg8KC0VOVklST05NRU5UEAYSEQoNQURNSU5fQUNDT1VOVBAHEhAKDEFVVE9PUFNfUlVMRRAIEggKBFBVU0gQCRIQCgxTVUJTQ1JJUFRJT04QChIWChJBRE1JTl9TVUJTQ1JJUFRJT04QCxILCgdQUk9KRUNUEAwSFwoTUFJPR1JFU1NJVkVfUk9MTE9VVBAOEhAKDE9SR0FOSVpBVElPThAPEhAKDEZMQUdfVFJJR0dFUhAQEgcKA1RBRxAREgsKB0NPREVSRUYQEiIECA0QDSKvKQoEVHlwZRILCgdVTktOT1dOEAASEwoPRkVBVFVSRV9DUkVBVEVEEAESEwoPRkVBVFVSRV9SRU5BTUVEEAISEwoPRkVBVFVSRV9FTkFCTEVEEAMSFAoQRkVBVFVSRV9ESVNBQkxFRBAEEhMKD0ZFQVRVUkVfREVMRVRFRBAFEh8KG0ZFQVRVUkVfREVTQ1JJUFRJT05fQ0hBTkdFRBAIEhsKF0ZFQVRVUkVfVkFSSUFUSU9OX0FEREVEEAkSHQoZRkVBVFVSRV9WQVJJQVRJT05fUkVNT1ZFRBAKEiEKHUZFQVRVUkVfT0ZGX1ZBUklBVElPTl9DSEFOR0VEEAsSGwoXVkFSSUFUSU9OX1ZBTFVFX0NIQU5HRUQQDBIaChZWQVJJQVRJT05fTkFNRV9DSEFOR0VEEA0SIQodVkFSSUFUSU9OX0RFU0NSSVBUSU9OX0NIQU5HRUQQDhIYChRWQVJJQVRJT05fVVNFUl9BRERFRBAPEhoKFlZBUklBVElPTl9VU0VSX1JFTU9WRUQQEBIWChJGRUFUVVJFX1JVTEVfQURERUQQERIhCh1GRUFUVVJFX1JVTEVfU1RSQVRFR1lfQ0hBTkdFRBASEhgKFEZFQVRVUkVfUlVMRV9ERUxFVEVEEBMSFQoRUlVMRV9DTEFVU0VfQURERUQQFBIXChNSVUxFX0NMQVVTRV9ERUxFVEVEEBUSHwobUlVMRV9GSVhFRF9TVFJBVEVHWV9DSEFOR0VEEBYSIQodUlVMRV9ST0xMT1VUX1NUUkFURUdZX0NIQU5HRUQQFxIcChhDTEFVU0VfQVRUUklCVVRFX0NIQU5HRUQQGBIbChdDTEFVU0VfT1BFUkFUT1JfQ0hBTkdFRBAZEhYKEkNMQVVTRV9WQUxVRV9BRERFRBAaEhgKFENMQVVTRV9WQUxVRV9SRU1PVkVEEBsSJAogRkVBVFVSRV9ERUZBVUxUX1NUUkFURUdZX0NIQU5HRUQQHBIVChFGRUFUVVJFX1RBR19BRERFRBAdEhcKE0ZFQVRVUkVfVEFHX1JFTU9WRUQQHhIfChtGRUFUVVJFX1ZFUlNJT05fSU5DUkVNRU5URUQQHxIUChBGRUFUVVJFX0FSQ0hJVkVEECASEgoORkVBVFVSRV9DTE9ORUQQIRIWChJGRUFUVVJFX1VOQVJDSElWRUQQIxIXChNTQU1QTElOR19TRUVEX1JFU0VUECISFgoSUFJFUkVRVUlTSVRFX0FEREVEECQSGAoUUFJFUkVRVUlTSVRFX1JFTU9WRUQQJRIiCh5QUkVSRVFVSVNJVEVfVkFSSUFUSU9OX0NIQU5HRUQQJhIfChtGRUFUVVJFX1JVTEVTX09SREVSX0NIQU5HRUQQJxITCg9GRUFUVVJFX1VQREFURUQQKBIQCgxHT0FMX0NSRUFURUQQZBIQCgxHT0FMX1JFTkFNRUQQZRIcChhHT0FMX0RFU0NSSVBUSU9OX0NIQU5HRUQQZhIQCgxHT0FMX0RFTEVURUQQZxIRCg1HT0FMX0FSQ0hJVkVEEGgSEAoMR09BTF9VUERBVEVEEGkSFwoSRVhQRVJJTUVOVF9DUkVBVEVEEMgBEhcKEkVYUEVSSU1FTlRfU1RPUFBFRBDJARIgChtFWFBFUklNRU5UX1NUQVJUX0FUX0NIQU5HRUQQygESHwoaRVhQRVJJTUVOVF9TVE9QX0FUX0NIQU5HRUQQywESFwoSRVhQRVJJTUVOVF9ERUxFVEVEEMwBEh4KGUVYUEVSSU1FTlRfUEVSSU9EX0NIQU5HRUQQzQESHAoXRVhQRVJJTUVOVF9OQU1FX0NIQU5HRUQQzgESIwoeRVhQRVJJTUVOVF9ERVNDUklQVElPTl9DSEFOR0VEEM8BEhcKEkVYUEVSSU1FTlRfU1RBUlRFRBDQARIYChNFWFBFUklNRU5UX0ZJTklTSEVEENEBEhgKE0VYUEVSSU1FTlRfQVJDSElWRUQQ0gESGAoPQUNDT1VOVF9DUkVBVEVEEKwCGgIIARIdChRBQ0NPVU5UX1JPTEVfQ0hBTkdFRBCtAhoCCAESGAoPQUNDT1VOVF9FTkFCTEVEEK4CGgIIARIZChBBQ0NPVU5UX0RJU0FCTEVEEK8CGgIIARIYCg9BQ0NPVU5UX0RFTEVURUQQsAIaAggBEhcKEkFDQ09VTlRfVjJfQ1JFQVRFRBCxAhIcChdBQ0NPVU5UX1YyX05BTUVfQ0hBTkdFRBCyAhIoCiNBQ0NPVU5UX1YyX0FWQVRBUl9JTUFHRV9VUkxfQ0hBTkdFRBCzAhIpCiRBQ0NPVU5UX1YyX09SR0FOSVpBVElPTl9ST0xFX0NIQU5HRUQQtAISKQokQUNDT1VOVF9WMl9FTlZJUk9OTUVOVF9ST0xFU19DSEFOR0VEELUCEhcKEkFDQ09VTlRfVjJfRU5BQkxFRBC2AhIYChNBQ0NPVU5UX1YyX0RJU0FCTEVEELcCEhcKEkFDQ09VTlRfVjJfREVMRVRFRBC4AhIlCiBBQ0NPVU5UX1YyX0NSRUFURURfU0VBUkNIX0ZJTFRFUhC5AhIqCiVBQ0NPVU5UX1YyX1NFQVJDSF9GSUxURVJfTkFORV9DSEFOR0VEELoCEisKJkFDQ09VTlRfVjJfU0VBUkNIX0ZJTFRFUl9RVUVSWV9DSEFOR0VEELsCEi0KKEFDQ09VTlRfVjJfU0VBUkNIX0ZJTFRFUl9ERUZBVUxUX0NIQU5HRUQQvAISJQogQUNDT1VOVF9WMl9TRUFSQ0hfRklMVEVSX0RFTEVURUQQvQISIgodQUNDT1VOVF9WMl9GSVJTVF9OQU1FX0NIQU5HRUQQvgISIQocQUNDT1VOVF9WMl9MQVNUX05BTUVfQ0hBTkdFRBC/AhIgChtBQ0NPVU5UX1YyX0xBTkdVQUdFX0NIQU5HRUQQwAISFwoSQUNDT1VOVF9WMl9VUERBVEVEEMECEhwKF0FDQ09VTlRfVjJfVEFHU19DSEFOR0VEEMICEhMKDkFQSUtFWV9DUkVBVEVEEJADEhgKE0FQSUtFWV9OQU1FX0NIQU5HRUQQkQMSEwoOQVBJS0VZX0VOQUJMRUQQkgMSFAoPQVBJS0VZX0RJU0FCTEVEEJMDEhMKDkFQSUtFWV9DSEFOR0VEEJQDEhQKD1NFR01FTlRfQ1JFQVRFRBD0AxIUCg9TRUdNRU5UX0RFTEVURUQQ9QMSGQoUU0VHTUVOVF9OQU1FX0NIQU5HRUQQ9gMSIAobU0VHTUVOVF9ERVNDUklQVElPTl9DSEFOR0VEEPcDEhcKElNFR01FTlRfUlVMRV9BRERFRBD4AxIZChRTRUdNRU5UX1JVTEVfREVMRVRFRBD5AxIeChlTRUdNRU5UX1JVTEVfQ0xBVVNFX0FEREVEEPoDEiAKG1NFR01FTlRfUlVMRV9DTEFVU0VfREVMRVRFRBD7AxIlCiBTRUdNRU5UX0NMQVVTRV9BVFRSSUJVVEVfQ0hBTkdFRBD8AxIkCh9TRUdNRU5UX0NMQVVTRV9PUEVSQVRPUl9DSEFOR0VEEP0DEh8KGlNFR01FTlRfQ0xBVVNFX1ZBTFVFX0FEREVEEP4DEiEKHFNFR01FTlRfQ0xBVVNFX1ZBTFVFX1JFTU9WRUQQ/wMSFwoSU0VHTUVOVF9VU0VSX0FEREVEEIAEEhkKFFNFR01FTlRfVVNFUl9ERUxFVEVEEIEEEh4KGVNFR01FTlRfQlVMS19VUExPQURfVVNFUlMQggQSLQooU0VHTUVOVF9CVUxLX1VQTE9BRF9VU0VSU19TVEFUVVNfQ0hBTkdFRBCDBBIUCg9TRUdNRU5UX1VQREFURUQQhAQSGAoTRU5WSVJPTk1FTlRfQ1JFQVRFRBDYBBIYChNFTlZJUk9OTUVOVF9SRU5BTUVEENkEEiQKH0VOVklST05NRU5UX0RFU0NSSVBUSU9OX0NIQU5HRUQQ2gQSGAoTRU5WSVJPTk1FTlRfREVMRVRFRBDbBBIbChZFTlZJUk9OTUVOVF9WMl9DUkVBVEVEENwEEhsKFkVOVklST05NRU5UX1YyX1JFTkFNRUQQ3QQSJwoiRU5WSVJPTk1FTlRfVjJfREVTQ1JJUFRJT05fQ0hBTkdFRBDeBBIcChdFTlZJUk9OTUVOVF9WMl9BUkNISVZFRBDfBBIeChlFTlZJUk9OTUVOVF9WMl9VTkFSQ0hJVkVEEOAEEisKJkVOVklST05NRU5UX1YyX1JFUVVJUkVfQ09NTUVOVF9DSEFOR0VEEOEEEh4KFUFETUlOX0FDQ09VTlRfQ1JFQVRFRBC8BRoCCAESHgoVQURNSU5fQUNDT1VOVF9FTkFCTEVEEL4FGgIIARIfChZBRE1JTl9BQ0NPVU5UX0RJU0FCTEVEEL8FGgIIARIZChRBVVRPT1BTX1JVTEVfQ1JFQVRFRBCgBhIZChRBVVRPT1BTX1JVTEVfREVMRVRFRBChBhIiCh1BVVRPT1BTX1JVTEVfT1BTX1RZUEVfQ0hBTkdFRBCiBhIgChtBVVRPT1BTX1JVTEVfQ0xBVVNFX0RFTEVURUQQowYSKgohQVVUT09QU19SVUxFX1RSSUdHRVJFRF9BVF9DSEFOR0VEEKQGGgIIARIgChtPUFNfRVZFTlRfUkFURV9DTEFVU0VfQURERUQQpQYSIgodT1BTX0VWRU5UX1JBVEVfQ0xBVVNFX0NIQU5HRUQQpgYSGgoVREFURVRJTUVfQ0xBVVNFX0FEREVEEKcGEhwKF0RBVEVUSU1FX0NMQVVTRV9DSEFOR0VEEKgGEhkKFEFVVE9PUFNfUlVMRV9TVE9QUEVEEKkGEiQKH0FVVE9PUFNfUlVMRV9PUFNfU1RBVFVTX0NIQU5HRUQQqgYSEQoMUFVTSF9DUkVBVEVEEIQHEhEKDFBVU0hfREVMRVRFRBCFBxIUCg9QVVNIX1RBR1NfQURERUQQhgcSFgoRUFVTSF9UQUdTX0RFTEVURUQQhwcSEQoMUFVTSF9SRU5BTUVEEIgHEhEKDFBVU0hfVVBEQVRFRBCJBxIZChRTVUJTQ1JJUFRJT05fQ1JFQVRFRBDoBxIZChRTVUJTQ1JJUFRJT05fREVMRVRFRBDpBxIZChRTVUJTQ1JJUFRJT05fRU5BQkxFRBDqBxIaChVTVUJTQ1JJUFRJT05fRElTQUJMRUQQ6wcSIwoeU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0FEREVEEOwHEiUKIFNVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9ERUxFVEVEEO0HEhkKFFNVQlNDUklQVElPTl9SRU5BTUVEEO4HEhkKFFNVQlNDUklQVElPTl9VUERBVEVEEO8HEh8KGkFETUlOX1NVQlNDUklQVElPTl9DUkVBVEVEEMwIEh8KGkFETUlOX1NVQlNDUklQVElPTl9ERUxFVEVEEM0IEh8KGkFETUlOX1NVQlNDUklQVElPTl9FTkFCTEVEEM4IEiAKG0FETUlOX1NVQlNDUklQVElPTl9ESVNBQkxFRBDPCBIpCiRBRE1JTl9TVUJTQ1JJUFRJT05fU09VUkNFX1RZUEVfQURERUQQ0AgSKwomQURNSU5fU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0RFTEVURUQQ0QgSHwoaQURNSU5fU1VCU0NSSVBUSU9OX1JFTkFNRUQQ0ggSFAoPUFJPSkVDVF9DUkVBVEVEELAJEiAKG1BST0pFQ1RfREVTQ1JJUFRJT05fQ0hBTkdFRBCxCRIUCg9QUk9KRUNUX0VOQUJMRUQQsgkSFQoQUFJPSkVDVF9ESVNBQkxFRBCzCRIaChVQUk9KRUNUX1RSSUFMX0NSRUFURUQQtAkSHAoXUFJPSkVDVF9UUklBTF9DT05WRVJURUQQtQkSFAoPUFJPSkVDVF9SRU5BTUVEELYJEiAKG1BST0dSRVNTSVZFX1JPTExPVVRfQ1JFQVRFRBD4ChIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX0RFTEVURUQQ+QoSNgoxUFJPR1JFU1NJVkVfUk9MTE9VVF9TQ0hFRFVMRV9UUklHR0VSRURfQVRfQ0hBTkdFRBD6ChIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX1NUT1BQRUQQ+woSGQoUT1JHQU5JWkFUSU9OX0NSRUFURUQQ3AsSHgoZT1JHQU5JWkFUSU9OX05BTUVfQ0hBTkdFRBDdCxIlCiBPUkdBTklaQVRJT05fREVTQ1JJUFRJT05fQ0hBTkdFRBDeCxIZChRPUkdBTklaQVRJT05fRU5BQkxFRBDfCxIaChVPUkdBTklaQVRJT05fRElTQUJMRUQQ4AsSGgoVT1JHQU5JWkFUSU9OX0FSQ0hJVkVEEOELEhwKF09SR0FOSVpBVElPTl9VTkFSQ0hJVkVEEOILEiEKHE9SR0FOSVpBVElPTl9UUklBTF9DT05WRVJURUQQ4wsSJQogT1JHQU5JWkFUSU9OX09XTkVSX0VNQUlMX0NIQU5HRUQQ5AsSGQoURkxBR19UUklHR0VSX0NSRUFURUQQwQwSFwoSRkxBR19UUklHR0VSX1JFU0VUEMIMEiUKIEZMQUdfVFJJR0dFUl9ERVNDUklQVElPTl9DSEFOR0VEEMMMEhoKFUZMQUdfVFJJR0dFUl9ESVNBQkxFRBDEDBIZChRGTEFHX1RSSUdHRVJfRU5BQkxFRBDFDBIZChRGTEFHX1RSSUdHRVJfREVMRVRFRBDGDBIfChpGTEFHX1RSSUdHRVJfVVNBR0VfVVBEQVRFRBDHDBIQCgtUQUdfQ1JFQVRFRBClDRIQCgtUQUdfREVMRVRFRBCmDRIbChZDT0RFX1JFRkVSRU5DRV9DUkVBVEVEEIgOEhsKFkNPREVfUkVGRVJFTkNFX1VQREFURUQQiQ4SGwoWQ09ERV9SRUZFUkVOQ0VfREVMRVRFRBCKDiIGCJQKEJQKIgYIlQoQlQoiBgiWChCWCiIGCJcKEJcKIgYImAoQmAoiBgiZChCZCkoECAgQCSKMAgoGRWRpdG9yEhQKBWVtYWlsGAEgASgJUgVlbWFpbBIZCghpc19hZG1pbhgDIAEoCFIHaXNBZG1pbhISCgRuYW1lGAQgASgJUgRuYW1lEloKEXB1YmxpY19hcGlfZWRpdG9yGAUgASgLMi4uYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FZGl0b3IuUHVibGljQVBJRWRpdG9yUg9wdWJsaWNBcGlFZGl0b3IaWwoPUHVibGljQVBJRWRpdG9yEhQKBXRva2VuGAEgASgJUgV0b2tlbhIeCgptYWludGFpbmVyGAIgASgJUgptYWludGFpbmVyEhIKBG5hbWUYAyABKAlSBG5hbWVKBAgCEAMiRAoHT3B0aW9ucxIYCgdjb21tZW50GAEgASgJUgdjb21tZW50Eh8KC25ld192ZXJzaW9uGAIgASgFUgpuZXdWZXJzaW9uIvMEChNGZWF0dXJlQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhISCgR1c2VyGAQgASgJUgR1c2VyEjwKCnZhcmlhdGlvbnMYBSADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSWAoaZGVmYXVsdF9vbl92YXJpYXRpb25faW5kZXgYBiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIXZGVmYXVsdE9uVmFyaWF0aW9uSW5kZXgSWgobZGVmYXVsdF9vZmZfdmFyaWF0aW9uX2luZGV4GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSGGRlZmF1bHRPZmZWYXJpYXRpb25JbmRleBJPCg52YXJpYXRpb25fdHlwZRgIIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRISCgR0YWdzGAkgAygJUgR0YWdzEkUKDXByZXJlcXVpc2l0ZXMYCiADKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDXByZXJlcXVpc2l0ZXMSLQoFcnVsZXMYCyADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzImYKE0ZlYXR1cmVVcGRhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhYKBGRhdGEYAiABKAlCAhgBUgRkYXRhEicKDXByZXZpb3VzX2RhdGEYAyABKAlCAhgBUgxwcmV2aW91c0RhdGEiJQoTRmVhdHVyZUVuYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiJgoURmVhdHVyZURpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiYKFEZlYXR1cmVBcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIoChZGZWF0dXJlVW5hcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIlChNGZWF0dXJlRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCItChtFdmFsdWF0aW9uRGVsYXlhYmxlU2V0RXZlbnQSDgoCaWQYASABKAlSAmlkIi8KHUV2YWx1YXRpb25VbmRlbGF5YWJsZVNldEV2ZW50Eg4KAmlkGAEgASgJUgJpZCI5ChNGZWF0dXJlUmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlIKHkZlYXR1cmVEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIlYKH0ZlYXR1cmVPZmZWYXJpYXRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiMKDW9mZl92YXJpYXRpb24YAiABKAlSDG9mZlZhcmlhdGlvbiJoChpGZWF0dXJlVmFyaWF0aW9uQWRkZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSOgoJdmFyaWF0aW9uGAIgASgLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgl2YXJpYXRpb24iUQocRmVhdHVyZVZhcmlhdGlvblJlbW92ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCJhChpWYXJpYXRpb25WYWx1ZUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSDgoCaWQYAiABKAlSAmlkEhQKBXZhbHVlGAMgASgJUgV2YWx1ZSJeChlWYXJpYXRpb25OYW1lQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSEgoEbmFtZRgDIAEoCVIEbmFtZSJzCiBWYXJpYXRpb25EZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSDgoCaWQYAiABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbiJcChdWYXJpYXRpb25Vc2VyQWRkZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSDgoCaWQYAiABKAlSAmlkEhIKBHVzZXIYAyABKAlSBHVzZXIiXgoZVmFyaWF0aW9uVXNlclJlbW92ZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSDgoCaWQYAiABKAlSAmlkEhIKBHVzZXIYAyABKAlSBHVzZXIiVAoVRmVhdHVyZVJ1bGVBZGRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIrCgRydWxlGAIgASgLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIEcnVsZSKRAQoeRmVhdHVyZUNoYW5nZVJ1bGVTdHJhdGVneUV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSNwoIc3RyYXRlZ3kYAyABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIIc3RyYXRlZ3kiWQodRmVhdHVyZVJ1bGVzT3JkZXJDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhkKCHJ1bGVfaWRzGAIgAygJUgdydWxlSWRzIkIKF0ZlYXR1cmVSdWxlRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQimAEKIEZlYXR1cmVGaXhlZFN0cmF0ZWd5Q2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSPAoIc3RyYXRlZ3kYAyABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5UghzdHJhdGVneSKcAQoiRmVhdHVyZVJvbGxvdXRTdHJhdGVneUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEj4KCHN0cmF0ZWd5GAMgASgLMiIuYnVja2V0ZWVyLmZlYXR1cmUuUm9sbG91dFN0cmF0ZWd5UghzdHJhdGVneSKBAQoUUnVsZUNsYXVzZUFkZGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIxCgZjbGF1c2UYAyABKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2VSBmNsYXVzZSJgChZSdWxlQ2xhdXNlRGVsZXRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSDgoCaWQYAyABKAlSAmlkIoMBChtDbGF1c2VBdHRyaWJ1dGVDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSHAoJYXR0cmlidXRlGAQgASgJUglhdHRyaWJ1dGUipAEKGkNsYXVzZU9wZXJhdG9yQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSDgoCaWQYAyABKAlSAmlkEj4KCG9wZXJhdG9yGAQgASgOMiIuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvciJ1ChVDbGF1c2VWYWx1ZUFkZGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSFAoFdmFsdWUYBCABKAlSBXZhbHVlIncKF0NsYXVzZVZhbHVlUmVtb3ZlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSDgoCaWQYAyABKAlSAmlkEhQKBXZhbHVlGAQgASgJUgV2YWx1ZSJtCiJGZWF0dXJlRGVmYXVsdFN0cmF0ZWd5Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSI4ChRGZWF0dXJlVGFnQWRkZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEAoDdGFnGAIgASgJUgN0YWciOgoWRmVhdHVyZVRhZ1JlbW92ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEAoDdGFnGAIgASgJUgN0YWciSgoeRmVhdHVyZVZlcnNpb25JbmNyZW1lbnRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uIrUEChJGZWF0dXJlQ2xvbmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSMwoHdGFyZ2V0cxgFIAMoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlRhcmdldFIHdGFyZ2V0cxItCgVydWxlcxgGIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEkYKEGRlZmF1bHRfc3RyYXRlZ3kYByABKAsyGy5idWNrZXRlZXIuZmVhdHVyZS5TdHJhdGVneVIPZGVmYXVsdFN0cmF0ZWd5EiMKDW9mZl92YXJpYXRpb24YCCABKAlSDG9mZlZhcmlhdGlvbhISCgR0YWdzGAkgAygJUgR0YWdzEh4KCm1haW50YWluZXIYCiABKAlSCm1haW50YWluZXISTwoOdmFyaWF0aW9uX3R5cGUYCyABKA4yKC5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlLlZhcmlhdGlvblR5cGVSDXZhcmlhdGlvblR5cGUSRQoNcHJlcmVxdWlzaXRlcxgMIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcyJECh1GZWF0dXJlU2FtcGxpbmdTZWVkUmVzZXRFdmVudBIjCg1zYW1wbGluZ19zZWVkGAEgASgJUgxzYW1wbGluZ1NlZWQihAIKEEdvYWxDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlbGV0ZWQYBCABKAhSB2RlbGV0ZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBJSCg9jb25uZWN0aW9uX3R5cGUYByABKA4yKS5idWNrZXRlZXIuZXhwZXJpbWVudC5Hb2FsLkNvbm5lY3Rpb25UeXBlUg5jb25uZWN0aW9uVHlwZSKUAQoQR29hbFVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSMAoEbmFtZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRI+CgtkZXNjcmlwdGlvbhgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVILZGVzY3JpcHRpb24iNgoQR29hbFJlbmFtZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJPChtHb2FsRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiIjChFHb2FsQXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiIgoQR29hbERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQi8wMKFkV4cGVyaW1lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEjwKCnZhcmlhdGlvbnMYBCADKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCnZhcmlhdGlvbnMSGwoHZ29hbF9pZBgFIAEoCUICGAFSBmdvYWxJZBIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSGAoHc3RvcHBlZBgIIAEoCFIHc3RvcHBlZBIdCgpzdG9wcGVkX2F0GAkgASgDUglzdG9wcGVkQXQSHQoKY3JlYXRlZF9hdBgKIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCyABKANSCXVwZGF0ZWRBdBIZCghnb2FsX2lkcxgMIAMoCVIHZ29hbElkcxISCgRuYW1lGA0gASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGA4gASgJUgtkZXNjcmlwdGlvbhIqChFiYXNlX3ZhcmlhdGlvbl9pZBgPIAEoCVIPYmFzZVZhcmlhdGlvbklkIkcKFkV4cGVyaW1lbnRTdG9wcGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCnN0b3BwZWRfYXQYAiABKANSCXN0b3BwZWRBdCIpChdFeHBlcmltZW50QXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiKAoWRXhwZXJpbWVudERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiSgodRXhwZXJpbWVudFN0YXJ0QXRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0IkcKHEV4cGVyaW1lbnRTdG9wQXRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3N0b3BfYXQYAiABKANSBnN0b3BBdCJiChxFeHBlcmltZW50UGVyaW9kQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIZCghzdGFydF9hdBgCIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAMgASgDUgZzdG9wQXQiQAoaRXhwZXJpbWVudE5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVQohRXhwZXJpbWVudERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iGAoWRXhwZXJpbWVudFN0YXJ0ZWRFdmVudCIZChdFeHBlcmltZW50RmluaXNoZWRFdmVudCKSBAoVQWNjb3VudFYyQ3JlYXRlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEigKEGF2YXRhcl9pbWFnZV91cmwYAyABKAlSDmF2YXRhckltYWdlVXJsEicKD29yZ2FuaXphdGlvbl9pZBgEIAEoCVIOb3JnYW5pemF0aW9uSWQSWwoRb3JnYW5pemF0aW9uX3JvbGUYBSABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzEhoKCGRpc2FibGVkGAcgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0Eh0KCmZpcnN0X25hbWUYCiABKAlSCWZpcnN0TmFtZRIbCglsYXN0X25hbWUYCyABKAlSCGxhc3ROYW1lEhoKCGxhbmd1YWdlGAwgASgJUghsYW5ndWFnZRISCgR0YWdzGA0gAygJUgR0YWdzIlYKFUFjY291bnRWMlVwZGF0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZCJFChlBY2NvdW50VjJOYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lImUKI0FjY291bnRWMkF2YXRhckltYWdlVVJMQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIoChBhdmF0YXJfaW1hZ2VfdXJsGAIgASgJUg5hdmF0YXJJbWFnZVVybCJFChlBY2NvdW50VjJUYWdzQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgR0YWdzGAIgAygJUgR0YWdzIpoBCiVBY2NvdW50VjJPcmdhbml6YXRpb25Sb2xlQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBJbChFvcmdhbml6YXRpb25fcm9sZRgCIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZSKYAQolQWNjb3VudFYyRW52aXJvbm1lbnRSb2xlc0NoYW5nZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSWQoRZW52aXJvbm1lbnRfcm9sZXMYAiADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzIi0KFUFjY291bnRWMkVuYWJsZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiLgoWQWNjb3VudFYyRGlzYWJsZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwiLQoVQWNjb3VudFYyRGVsZXRlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbCLXAQoYU2VhcmNoRmlsdGVyQ3JlYXRlZEV2ZW50EhIKBE5hbWUYASABKAlSBE5hbWUSFAoFUXVlcnkYAiABKAlSBVF1ZXJ5EkMKClRhcmdldFR5cGUYAyABKA4yIy5idWNrZXRlZXIuYWNjb3VudC5GaWx0ZXJUYXJnZXRUeXBlUgpUYXJnZXRUeXBlEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkEiUKDmRlZmF1bHRfZmlsdGVyGAUgASgIUg1kZWZhdWx0RmlsdGVyIkIKHFNlYXJjaEZpbHRlck5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBE5hbWUYAiABKAlSBE5hbWUiRQodU2VhcmNoRmlsdGVyUXVlcnlDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhQKBVF1ZXJ5GAIgASgJUgVRdWVyeSJYCh9TZWFyY2hGaWx0ZXJEZWZhdWx0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIlCg5kZWZhdWx0X2ZpbHRlchgCIAEoCFINZGVmYXVsdEZpbHRlciIqChhTZWFyY2hGaWx0ZXJEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIv8BChJBUElLZXlDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSMgoEcm9sZRgDIAEoDjIeLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleS5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAQgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Eh4KCm1haW50YWluZXIYByABKAlSCm1haW50YWluZXISFwoHYXBpX2tleRgIIAEoCVIGYXBpS2V5IiQKEkFQSUtleUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiPAoWQVBJS2V5TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIkChJBUElLZXlFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0FQSUtleURpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlsKE1NlZ21lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIiUKE1NlZ21lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIpcBChNTZWdtZW50VXBkYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIwCgRuYW1lGAIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgRuYW1lEj4KC2Rlc2NyaXB0aW9uGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlUgtkZXNjcmlwdGlvbiI9ChdTZWdtZW50TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSJSCh5TZWdtZW50RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiJUChVTZWdtZW50UnVsZUFkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEisKBHJ1bGUYAiABKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgRydWxlIkIKF1NlZ21lbnRSdWxlRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQiiAEKG1NlZ21lbnRSdWxlQ2xhdXNlQWRkZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgDIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlInQKHVNlZ21lbnRSdWxlQ2xhdXNlRGVsZXRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZCKXAQoiU2VnbWVudENsYXVzZUF0dHJpYnV0ZUNoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSHAoJYXR0cmlidXRlGAQgASgJUglhdHRyaWJ1dGUiuAEKIVNlZ21lbnRDbGF1c2VPcGVyYXRvckNoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSPgoIb3BlcmF0b3IYBCABKA4yIi5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yIokBChxTZWdtZW50Q2xhdXNlVmFsdWVBZGRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUiiwEKHlNlZ21lbnRDbGF1c2VWYWx1ZVJlbW92ZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSFAoFdmFsdWUYBCABKAlSBXZhbHVlIo0BChVTZWdtZW50VXNlckFkZGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhkKCHVzZXJfaWRzGAIgAygJUgd1c2VySWRzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlIo8BChdTZWdtZW50VXNlckRlbGV0ZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSGQoIdXNlcl9pZHMYAiADKAlSB3VzZXJJZHMSOgoFc3RhdGUYAyABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUiswEKG1NlZ21lbnRCdWxrVXBsb2FkVXNlcnNFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSOQoGc3RhdHVzGAIgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSLWAQooU2VnbWVudEJ1bGtVcGxvYWRVc2Vyc1N0YXR1c0NoYW5nZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSOQoGc3RhdHVzGAIgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIUCgVjb3VudBgEIAEoA1IFY291bnQi9AEKF0Vudmlyb25tZW50Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIcCgluYW1lc3BhY2UYAiABKAlSCW5hbWVzcGFjZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSHQoKcHJvamVjdF9pZBgIIAEoCVIJcHJvamVjdElkIj0KF0Vudmlyb25tZW50UmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlYKIkVudmlyb25tZW50RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiJHChdFbnZpcm9ubWVudERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHAoJbmFtZXNwYWNlGAIgASgJUgluYW1lc3BhY2UingIKGUVudmlyb25tZW50VjJDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEh0KCnByb2plY3RfaWQYBSABKAlSCXByb2plY3RJZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBInCg9yZXF1aXJlX2NvbW1lbnQYCSABKAhSDnJlcXVpcmVDb21tZW50IoABChlFbnZpcm9ubWVudFYyUmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpwcm9qZWN0X2lkGAIgASgJUglwcm9qZWN0SWQSGQoIb2xkX25hbWUYAyABKAlSB29sZE5hbWUSGQoIbmV3X25hbWUYBCABKAlSB25ld05hbWUiuwEKJEVudmlyb25tZW50VjJEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQSJwoPb2xkX2Rlc2NyaXB0aW9uGAQgASgJUg5vbGREZXNjcmlwdGlvbhInCg9uZXdfZGVzY3JpcHRpb24YBSABKAlSDm5ld0Rlc2NyaXB0aW9uIpUBCidFbnZpcm9ubWVudFYyUmVxdWlyZUNvbW1lbnRDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkEicKD3JlcXVpcmVfY29tbWVudBgEIAEoCFIOcmVxdWlyZUNvbW1lbnQiXwoaRW52aXJvbm1lbnRWMkFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkImEKHEVudmlyb25tZW50VjJVbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSHQoKcHJvamVjdF9pZBgDIAEoCVIJcHJvamVjdElkIqkCChdBdXRvT3BzUnVsZUNyZWF0ZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNQoIb3BzX3R5cGUYAiABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlEjMKB2NsYXVzZXMYAyADKAsyGS5idWNrZXRlZXIuYXV0b29wcy5DbGF1c2VSB2NsYXVzZXMSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdBI/CgpvcHNfc3RhdHVzGAcgASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1IJb3BzU3RhdHVzSgQIBBAFIhkKF0F1dG9PcHNSdWxlU3RvcHBlZEV2ZW50IhkKF0F1dG9PcHNSdWxlRGVsZXRlZEV2ZW50IlcKHkF1dG9PcHNSdWxlT3BzVHlwZUNoYW5nZWRFdmVudBI1CghvcHNfdHlwZRgBIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUiJAoiQXV0b09wc1J1bGVUcmlnZ2VyZWRBdENoYW5nZWRFdmVudCJjCiBBdXRvT3BzUnVsZU9wc1N0YXR1c0NoYW5nZWRFdmVudBI/CgpvcHNfc3RhdHVzGAEgASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1IJb3BzU3RhdHVzIpUBChxPcHNFdmVudFJhdGVDbGF1c2VBZGRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSWAoVb3BzX2V2ZW50X3JhdGVfY2xhdXNlGAIgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhJvcHNFdmVudFJhdGVDbGF1c2UilwEKHk9wc0V2ZW50UmF0ZUNsYXVzZUNoYW5nZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkElgKFW9wc19ldmVudF9yYXRlX2NsYXVzZRgCIAEoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVISb3BzRXZlbnRSYXRlQ2xhdXNlIjwKHUF1dG9PcHNSdWxlQ2xhdXNlRGVsZXRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQigwEKGERhdGV0aW1lQ2xhdXNlQWRkZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkEkoKD2RhdGV0aW1lX2NsYXVzZRgCIAEoCzIhLmJ1Y2tldGVlci5hdXRvb3BzLkRhdGV0aW1lQ2xhdXNlUg5kYXRldGltZUNsYXVzZSKFAQoaRGF0ZXRpbWVDbGF1c2VDaGFuZ2VkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZBJKCg9kYXRldGltZV9jbGF1c2UYAiABKAsyIS5idWNrZXRlZXIuYXV0b29wcy5EYXRldGltZUNsYXVzZVIOZGF0ZXRpbWVDbGF1c2UicAoQUHVzaENyZWF0ZWRFdmVudBIuChNmY21fc2VydmljZV9hY2NvdW50GAEgASgJUhFmY21TZXJ2aWNlQWNjb3VudBISCgR0YWdzGAMgAygJUgR0YWdzEhIKBG5hbWUYBCABKAlSBG5hbWVKBAgCEAMiEgoQUHVzaERlbGV0ZWRFdmVudCIoChJQdXNoVGFnc0FkZGVkRXZlbnQSEgoEdGFncxgCIAMoCVIEdGFncyIqChRQdXNoVGFnc0RlbGV0ZWRFdmVudBISCgR0YWdzGAIgAygJUgR0YWdzIiYKEFB1c2hSZW5hbWVkRXZlbnQSEgoEbmFtZRgCIAEoCVIEbmFtZSIqChRQdXNoVGFnc1VwZGF0ZWRFdmVudBISCgR0YWdzGAIgAygJUgR0YWdzIlgKEFB1c2hVcGRhdGVkRXZlbnQSMAoEbmFtZRgBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRISCgR0YWdzGAIgAygJUgR0YWdzIsMBChhTdWJzY3JpcHRpb25DcmVhdGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAIgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAMgASgJUgRuYW1lIhoKGFN1YnNjcmlwdGlvbkRlbGV0ZWRFdmVudCIaChhTdWJzY3JpcHRpb25FbmFibGVkRXZlbnQiGwoZU3Vic2NyaXB0aW9uRGlzYWJsZWRFdmVudCJ3CiFTdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0FkZGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMieQojU3Vic2NyaXB0aW9uU291cmNlVHlwZXNEZWxldGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiLgoYU3Vic2NyaXB0aW9uUmVuYW1lZEV2ZW50EhIKBG5hbWUYASABKAlSBG5hbWUi6AEKGFN1YnNjcmlwdGlvblVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSMAoEbmFtZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVIEbmFtZRJSCgxzb3VyY2VfdHlwZXMYAyADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI2CghkaXNhYmxlZBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVSCGRpc2FibGVkIsgBCh1BZG1pblN1YnNjcmlwdGlvbkNyZWF0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYAiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYAyABKAlSBG5hbWUiHwodQWRtaW5TdWJzY3JpcHRpb25EZWxldGVkRXZlbnQiHwodQWRtaW5TdWJzY3JpcHRpb25FbmFibGVkRXZlbnQiIAoeQWRtaW5TdWJzY3JpcHRpb25EaXNhYmxlZEV2ZW50InwKJkFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNBZGRlZEV2ZW50ElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIn4KKEFkbWluU3Vic2NyaXB0aW9uU291cmNlVHlwZXNEZWxldGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMiMwodQWRtaW5TdWJzY3JpcHRpb25SZW5hbWVkRXZlbnQSEgoEbmFtZRgBIAEoCVIEbmFtZSKLAgoTUHJvamVjdENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZSJSCh5Qcm9qZWN0RGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbiI5ChNQcm9qZWN0UmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIiUKE1Byb2plY3RFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiYKFFByb2plY3REaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCKQAgoYUHJvamVjdFRyaWFsQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYAyABKAhSCGRpc2FibGVkEhQKBXRyaWFsGAQgASgIUgV0cmlhbBIjCg1jcmVhdG9yX2VtYWlsGAUgASgJUgxjcmVhdG9yRW1haWwSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAggASgJUgRuYW1lEhkKCHVybF9jb2RlGAkgASgJUgd1cmxDb2RlIiwKGlByb2plY3RUcmlhbENvbnZlcnRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCJdChZQcmVyZXF1aXNpdGVBZGRlZEV2ZW50EkMKDHByZXJlcXVpc2l0ZRgBIAEoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVIMcHJlcmVxdWlzaXRlImgKIVByZXJlcXVpc2l0ZVZhcmlhdGlvbkNoYW5nZWRFdmVudBJDCgxwcmVyZXF1aXNpdGUYASABKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDHByZXJlcXVpc2l0ZSI5ChhQcmVyZXF1aXNpdGVSZW1vdmVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkIvsBCh5Qcm9ncmVzc2l2ZVJvbGxvdXRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIsCgZjbGF1c2UYAyABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2USHQoKY3JlYXRlZF9hdBgEIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBSABKANSCXVwZGF0ZWRBdBI+CgR0eXBlGAYgASgOMiouYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlR5cGVSBHR5cGUi5QEKHlByb2dyZXNzaXZlUm9sbG91dFN0b3BwZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSRAoGc3RhdHVzGAIgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c1IGc3RhdHVzEk4KCnN0b3BwZWRfYnkYAyABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkSHQoKc3RvcHBlZF9hdBgEIAEoA1IJc3RvcHBlZEF0IjAKHlByb2dyZXNzaXZlUm9sbG91dERlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiVAoxUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGVUcmlnZ2VyZWRBdENoYW5nZWRFdmVudBIfCgtzY2hlZHVsZV9pZBgBIAEoCVIKc2NoZWR1bGVJZCKoAgoYT3JnYW5pemF0aW9uQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgFIAEoCFIIZGlzYWJsZWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEhQKBXRyaWFsGAcgASgIUgV0cmlhbBIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0Eh8KC293bmVyX2VtYWlsGAogASgJUgpvd25lckVtYWlsIlcKI09yZ2FuaXphdGlvbkRlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iVQoiT3JnYW5pemF0aW9uT3duZXJFbWFpbENoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHwoLb3duZXJfZW1haWwYAiABKAlSCm93bmVyRW1haWwiQgocT3JnYW5pemF0aW9uTmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIqChhPcmdhbml6YXRpb25FbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIisKGU9yZ2FuaXphdGlvbkRpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIisKGU9yZ2FuaXphdGlvbkFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIi0KG09yZ2FuaXphdGlvblVuYXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiMQofT3JnYW5pemF0aW9uVHJpYWxDb252ZXJ0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQi4wIKF0ZsYWdUcmlnZ2VyQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhQKBXRva2VuGAcgASgJUgV0b2tlbhIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0EiUKDmVudmlyb25tZW50X2lkGAogASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIokBChVGbGFnVHJpZ2dlclJlc2V0RXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIUCgV0b2tlbhgEIAEoCVIFdG9rZW4SJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiogEKIkZsYWdUcmlnZ2VyRGVzY3JpcHRpb25DaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SJQoOZW52aXJvbm1lbnRfaWQYBSABKAlSDWVudmlyb25tZW50SWRKBAgDEAQidgoYRmxhZ1RyaWdnZXJEaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJQoOZW52aXJvbm1lbnRfaWQYBCABKAlSDWVudmlyb25tZW50SWRKBAgDEAQidQoXRmxhZ1RyaWdnZXJFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgEIAEoCVINZW52aXJvbm1lbnRJZEoECAMQBCJ1ChdGbGFnVHJpZ2dlckRlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEiUKDmVudmlyb25tZW50X2lkGAQgASgJUg1lbnZpcm9ubWVudElkSgQIAxAEIssBChxGbGFnVHJpZ2dlclVzYWdlVXBkYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSKgoRbGFzdF90cmlnZ2VyZWRfYXQYBCABKANSD2xhc3RUcmlnZ2VyZWRBdBIjCg10cmlnZ2VyX3RpbWVzGAUgASgFUgx0cmlnZ2VyVGltZXMSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWRKBAgDEAQiVQoeQWNjb3VudFYyRmlyc3ROYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIdCgpmaXJzdF9uYW1lGAIgASgJUglmaXJzdE5hbWUiUgodQWNjb3VudFYyTGFzdE5hbWVDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsEhsKCWxhc3RfbmFtZRgCIAEoCVIIbGFzdE5hbWUiUQodQWNjb3VudFYyTGFuZ3VhZ2VDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsEhoKCGxhbmd1YWdlGAIgASgJUghsYW5ndWFnZSLaAQoPVGFnQ3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmNyZWF0ZWRfYXQYAyABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAQgASgDUgl1cGRhdGVkQXQSPgoLZW50aXR5X3R5cGUYBSABKA4yHS5idWNrZXRlZXIudGFnLlRhZy5FbnRpdHlUeXBlUgplbnRpdHlUeXBlEiUKDmVudmlyb25tZW50X2lkGAYgASgJUg1lbnZpcm9ubWVudElkIkgKD1RhZ0RlbGV0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYBiABKAlSDWVudmlyb25tZW50SWQiyQQKGUNvZGVSZWZlcmVuY2VDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoEiUKDmVudmlyb25tZW50X2lkGA0gASgJUg1lbnZpcm9ubWVudElkEh0KCmNyZWF0ZWRfYXQYDiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GA8gASgDUgl1cGRhdGVkQXQi3QIKGUNvZGVSZWZlcmVuY2VVcGRhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhsKCWZpbGVfcGF0aBgCIAEoCVIIZmlsZVBhdGgSHwoLbGluZV9udW1iZXIYAyABKAVSCmxpbmVOdW1iZXISIQoMY29kZV9zbmlwcGV0GAQgASgJUgtjb2RlU25pcHBldBIhCgxjb250ZW50X2hhc2gYBSABKAlSC2NvbnRlbnRIYXNoEhgKB2FsaWFzZXMYBiADKAlSB2FsaWFzZXMSKwoRcmVwb3NpdG9yeV9icmFuY2gYByABKAlSEHJlcG9zaXRvcnlCcmFuY2gSHwoLY29tbWl0X2hhc2gYCCABKAlSCmNvbW1pdEhhc2gSJQoOZW52aXJvbm1lbnRfaWQYCSABKAlSDWVudmlyb25tZW50SWQSHQoKdXBkYXRlZF9hdBgKIAEoA1IJdXBkYXRlZEF0IlIKGUNvZGVSZWZlcmVuY2VEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudC9kb21haW5iBnByb3RvMwrKAQoqcHJvdG8vZXZlbnQvZG9tYWluL2xvY2FsaXplZF9tZXNzYWdlLnByb3RvEhZidWNrZXRlZXIuZXZlbnQuZG9tYWluIkQKEExvY2FsaXplZE1lc3NhZ2USFgoGbG9jYWxlGAEgASgJUgZsb2NhbGUSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2FnZUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnQvZG9tYWluYgZwcm90bzMK+gUKHXByb3RvL2F1ZGl0bG9nL2F1ZGl0bG9nLnByb3RvEhJidWNrZXRlZXIuYXVkaXRsb2caGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHnByb3RvL2V2ZW50L2RvbWFpbi9ldmVudC5wcm90bxoqcHJvdG8vZXZlbnQvZG9tYWluL2xvY2FsaXplZF9tZXNzYWdlLnByb3RvIqEECghBdWRpdExvZxIOCgJpZBgBIAEoCVICaWQSHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASSQoLZW50aXR5X3R5cGUYAyABKA4yKC5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LkVudGl0eVR5cGVSCmVudGl0eVR5cGUSGwoJZW50aXR5X2lkGAQgASgJUghlbnRpdHlJZBI2CgR0eXBlGAUgASgOMiIuYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FdmVudC5UeXBlUgR0eXBlEioKBWV2ZW50GAYgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIFZXZlbnQSNgoGZWRpdG9yGAcgASgLMh4uYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FZGl0b3JSBmVkaXRvchI5CgdvcHRpb25zGAggASgLMh8uYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5PcHRpb25zUgdvcHRpb25zElUKEWxvY2FsaXplZF9tZXNzYWdlGAkgASgLMiguYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5Mb2NhbGl6ZWRNZXNzYWdlUhBsb2NhbGl6ZWRNZXNzYWdlEh8KC2VudGl0eV9kYXRhGAogASgJUgplbnRpdHlEYXRhEjAKFHByZXZpb3VzX2VudGl0eV9kYXRhGAsgASgJUhJwcmV2aW91c0VudGl0eURhdGFCMlowZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1ZGl0bG9nYgZwcm90bzMKoBMKHHByb3RvL2F1ZGl0bG9nL3NlcnZpY2UucHJvdG8SEmJ1Y2tldGVlci5hdWRpdGxvZxoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGh1wcm90by9hdWRpdGxvZy9hdWRpdGxvZy5wcm90byL8AwoUTGlzdEF1ZGl0TG9nc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJLCghvcmRlcl9ieRgEIAEoDjIwLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QXVkaXRMb2dzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmAKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI3LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QXVkaXRMb2dzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSEgoEZnJvbRgHIAEoA1IEZnJvbRIOCgJ0bxgIIAEoA1ICdG8SPAoLZW50aXR5X3R5cGUYCSABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIKZW50aXR5VHlwZRIlCg5lbnZpcm9ubWVudF9pZBgKIAEoCVINZW52aXJvbm1lbnRJZCIlCgdPcmRlckJ5EgsKB0RFRkFVTFQQABINCglUSU1FU1RBTVAQASIjCg5PcmRlckRpcmVjdGlvbhIICgRERVNDEAASBwoDQVNDEAFKBAgDEAQijQEKFUxpc3RBdWRpdExvZ3NSZXNwb25zZRI7CgphdWRpdF9sb2dzGAEgAygLMhwuYnVja2V0ZWVyLmF1ZGl0bG9nLkF1ZGl0TG9nUglhdWRpdExvZ3MSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi3gMKGUxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchJQCghvcmRlcl9ieRgDIAEoDjI1LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QWRtaW5BdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSZQoPb3JkZXJfZGlyZWN0aW9uGAQgASgOMjwuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAUgASgJUg1zZWFyY2hLZXl3b3JkEhIKBGZyb20YBiABKANSBGZyb20SDgoCdG8YByABKANSAnRvEjwKC2VudGl0eV90eXBlGAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSCmVudGl0eVR5cGUiJQoHT3JkZXJCeRILCgdERUZBVUxUEAASDQoJVElNRVNUQU1QEAEiIwoOT3JkZXJEaXJlY3Rpb24SCAoEREVTQxAAEgcKA0FTQxABIpIBChpMaXN0QWRtaW5BdWRpdExvZ3NSZXNwb25zZRI7CgphdWRpdF9sb2dzGAEgAygLMhwuYnVja2V0ZWVyLmF1ZGl0bG9nLkF1ZGl0TG9nUglhdWRpdExvZ3MSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi7AMKGUxpc3RGZWF0dXJlSGlzdG9yeVJlcXVlc3QSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISUAoIb3JkZXJfYnkYBSABKA4yNS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmUKD29yZGVyX2RpcmVjdGlvbhgGIAEoDjI8LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgHIAEoCVINc2VhcmNoS2V5d29yZBISCgRmcm9tGAggASgDUgRmcm9tEg4KAnRvGAkgASgDUgJ0bxIlCg5lbnZpcm9ubWVudF9pZBgKIAEoCVINZW52aXJvbm1lbnRJZCIlCgdPcmRlckJ5EgsKB0RFRkFVTFQQABINCglUSU1FU1RBTVAQASIjCg5PcmRlckRpcmVjdGlvbhIICgRERVNDEAASBwoDQVNDEAFKBAgEEAUikgEKGkxpc3RGZWF0dXJlSGlzdG9yeVJlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudDLnAgoPQXVkaXRMb2dTZXJ2aWNlEmYKDUxpc3RBdWRpdExvZ3MSKC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1JlcXVlc3QaKS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1Jlc3BvbnNlIgASdQoSTGlzdEFkbWluQXVkaXRMb2dzEi0uYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QaLi5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVzcG9uc2UiABJ1ChJMaXN0RmVhdHVyZUhpc3RvcnkSLS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdBouLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdWRpdGxvZ2IGcHJvdG8z
config:
grpcPort: 9000
httpPort: 9003
adminPort: 8001
resources: {}
- tagDescriptor: CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwroAwofZ29vZ2xlL2FwaS9maWVsZF9iZWhhdmlvci5wcm90bxIKZ29vZ2xlLmFwaRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8qtgEKDUZpZWxkQmVoYXZpb3ISHgoaRklFTERfQkVIQVZJT1JfVU5TUEVDSUZJRUQQABIMCghPUFRJT05BTBABEgwKCFJFUVVJUkVEEAISDwoLT1VUUFVUX09OTFkQAxIOCgpJTlBVVF9PTkxZEAQSDQoJSU1NVVRBQkxFEAUSEgoOVU5PUkRFUkVEX0xJU1QQBhIVChFOT05fRU1QVFlfREVGQVVMVBAHEg4KCklERU5USUZJRVIQCDpkCg5maWVsZF9iZWhhdmlvchIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYnAggAygOMhkuZ29vZ2xlLmFwaS5GaWVsZEJlaGF2aW9yQgIQAFINZmllbGRCZWhhdmlvckJwCg5jb20uZ29vZ2xlLmFwaUISRmllbGRCZWhhdmlvclByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCuIFChxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvEg9nb29nbGUucHJvdG9idWYimAEKBlN0cnVjdBI7CgZmaWVsZHMYASADKAsyIy5nb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5UgZmaWVsZHMaUQoLRmllbGRzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASKyAgoFVmFsdWUSOwoKbnVsbF92YWx1ZRgBIAEoDjIaLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAFIJbnVsbFZhbHVlEiMKDG51bWJlcl92YWx1ZRgCIAEoAUgAUgtudW1iZXJWYWx1ZRIjCgxzdHJpbmdfdmFsdWUYAyABKAlIAFILc3RyaW5nVmFsdWUSHwoKYm9vbF92YWx1ZRgEIAEoCEgAUglib29sVmFsdWUSPAoMc3RydWN0X3ZhbHVlGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAUgtzdHJ1Y3RWYWx1ZRI7CgpsaXN0X3ZhbHVlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZUgAUglsaXN0VmFsdWVCBgoEa2luZCI7CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YWx1ZXMqGwoJTnVsbFZhbHVlEg4KCk5VTExfVkFMVUUQAEJ/ChNjb20uZ29vZ2xlLnByb3RvYnVmQgtTdHJ1Y3RQcm90b1ABWi9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zdHJ1Y3RwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqY+Cixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iswgKB1N3YWdnZXISGAoHc3dhZ2dlchgBIAEoCVIHc3dhZ2dlchJDCgRpbmZvGAIgASgLMi8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mb1IEaW5mbxISCgRob3N0GAMgASgJUgRob3N0EhsKCWJhc2VfcGF0aBgEIAEoCVIIYmFzZVBhdGgSSwoHc2NoZW1lcxgFIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEl8KCXJlc3BvbnNlcxgKIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJxChRzZWN1cml0eV9kZWZpbml0aW9ucxgLIAEoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnNSE3NlY3VyaXR5RGVmaW5pdGlvbnMSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJCCgR0YWdzGA0gAygLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgR0YWdzEmUKDWV4dGVybmFsX2RvY3MYDiABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJiCgpleHRlbnNpb25zGA8gAygLMkIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJSgQICRAKItYHCglPcGVyYXRpb24SEgoEdGFncxgBIAMoCVIEdGFncxIYCgdzdW1tYXJ5GAIgASgJUgdzdW1tYXJ5EiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAQgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSIQoMb3BlcmF0aW9uX2lkGAUgASgJUgtvcGVyYXRpb25JZBIaCghjb25zdW1lcxgGIAMoCVIIY29uc3VtZXMSGgoIcHJvZHVjZXMYByADKAlSCHByb2R1Y2VzEmEKCXJlc3BvbnNlcxgJIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEksKB3NjaGVtZXMYCiADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSHgoKZGVwcmVjYXRlZBgLIAEoCFIKZGVwcmVjYXRlZBJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EmQKCmV4dGVuc2lvbnMYDSADKAsyRC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zElUKCnBhcmFtZXRlcnMYDiABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5QYXJhbWV0ZXJzUgpwYXJhbWV0ZXJzGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCSJiCgpQYXJhbWV0ZXJzElQKB2hlYWRlcnMYASADKAsyOi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXJSB2hlYWRlcnMiowIKD0hlYWRlclBhcmFtZXRlchISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJTCgR0eXBlGAMgASgOMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyLlR5cGVSBHR5cGUSFgoGZm9ybWF0GAQgASgJUgZmb3JtYXQSGgoIcmVxdWlyZWQYBSABKAhSCHJlcXVpcmVkIkUKBFR5cGUSCwoHVU5LTk9XThAAEgoKBlNUUklORxABEgoKBk5VTUJFUhACEgsKB0lOVEVHRVIQAxILCgdCT09MRUFOEARKBAgGEAdKBAgHEAgi2AEKBkhlYWRlchIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEgoEdHlwZRgCIAEoCVIEdHlwZRIWCgZmb3JtYXQYAyABKAlSBmZvcm1hdBIYCgdkZWZhdWx0GAYgASgJUgdkZWZhdWx0EhgKB3BhdHRlcm4YDSABKAlSB3BhdHRlcm5KBAgEEAVKBAgFEAZKBAgHEAhKBAgIEAlKBAgJEApKBAgKEAtKBAgLEAxKBAgMEA1KBAgOEA9KBAgPEBBKBAgQEBFKBAgREBJKBAgSEBMimgUKCFJlc3BvbnNlEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhJJCgZzY2hlbWEYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSBnNjaGVtYRJaCgdoZWFkZXJzGAMgAygLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEl0KCGV4YW1wbGVzGAQgAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXhhbXBsZXNFbnRyeVIIZXhhbXBsZXMSYwoKZXh0ZW5zaW9ucxgFIAMoCzJDLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxptCgxIZWFkZXJzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSRwoFdmFsdWUYAiABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJSBXZhbHVlOgI4ARo7Cg1FeGFtcGxlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi1gMKBEluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIoChB0ZXJtc19vZl9zZXJ2aWNlGAMgASgJUg50ZXJtc09mU2VydmljZRJMCgdjb250YWN0GAQgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuQ29udGFjdFIHY29udGFjdBJMCgdsaWNlbnNlGAUgASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuTGljZW5zZVIHbGljZW5zZRIYCgd2ZXJzaW9uGAYgASgJUgd2ZXJzaW9uEl8KCmV4dGVuc2lvbnMYByADKAsyPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJFCgdDb250YWN0EhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwSFAoFZW1haWwYAyABKAlSBWVtYWlsIi8KB0xpY2Vuc2USEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybCJLChVFeHRlcm5hbERvY3VtZW50YXRpb24SIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhAKA3VybBgCIAEoCVIDdXJsIqoCCgZTY2hlbWESVgoLanNvbl9zY2hlbWEYASABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUgpqc29uU2NoZW1hEiQKDWRpc2NyaW1pbmF0b3IYAiABKAlSDWRpc2NyaW1pbmF0b3ISGwoJcmVhZF9vbmx5GAMgASgIUghyZWFkT25seRJlCg1leHRlcm5hbF9kb2NzGAUgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSGAoHZXhhbXBsZRgGIAEoCVIHZXhhbXBsZUoECAQQBSLXCgoKSlNPTlNjaGVtYRIQCgNyZWYYAyABKAlSA3JlZhIUCgV0aXRsZRgFIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlZmF1bHQYByABKAlSB2RlZmF1bHQSGwoJcmVhZF9vbmx5GAggASgIUghyZWFkT25seRIYCgdleGFtcGxlGAkgASgJUgdleGFtcGxlEh8KC211bHRpcGxlX29mGAogASgBUgptdWx0aXBsZU9mEhgKB21heGltdW0YCyABKAFSB21heGltdW0SKwoRZXhjbHVzaXZlX21heGltdW0YDCABKAhSEGV4Y2x1c2l2ZU1heGltdW0SGAoHbWluaW11bRgNIAEoAVIHbWluaW11bRIrChFleGNsdXNpdmVfbWluaW11bRgOIAEoCFIQZXhjbHVzaXZlTWluaW11bRIdCgptYXhfbGVuZ3RoGA8gASgEUgltYXhMZW5ndGgSHQoKbWluX2xlbmd0aBgQIAEoBFIJbWluTGVuZ3RoEhgKB3BhdHRlcm4YESABKAlSB3BhdHRlcm4SGwoJbWF4X2l0ZW1zGBQgASgEUghtYXhJdGVtcxIbCgltaW5faXRlbXMYFSABKARSCG1pbkl0ZW1zEiEKDHVuaXF1ZV9pdGVtcxgWIAEoCFILdW5pcXVlSXRlbXMSJQoObWF4X3Byb3BlcnRpZXMYGCABKARSDW1heFByb3BlcnRpZXMSJQoObWluX3Byb3BlcnRpZXMYGSABKARSDW1pblByb3BlcnRpZXMSGgoIcmVxdWlyZWQYGiADKAlSCHJlcXVpcmVkEhQKBWFycmF5GCIgAygJUgVhcnJheRJfCgR0eXBlGCMgAygOMksuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5KU09OU2NoZW1hU2ltcGxlVHlwZXNSBHR5cGUSFgoGZm9ybWF0GCQgASgJUgZmb3JtYXQSEgoEZW51bRguIAMoCVIEZW51bRJ6ChNmaWVsZF9jb25maWd1cmF0aW9uGOkHIAEoCzJILmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRmllbGRDb25maWd1cmF0aW9uUhJmaWVsZENvbmZpZ3VyYXRpb24SZQoKZXh0ZW5zaW9ucxgwIAMoCzJFLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGjwKEkZpZWxkQ29uZmlndXJhdGlvbhImCg9wYXRoX3BhcmFtX25hbWUYLyABKAlSDXBhdGhQYXJhbU5hbWUaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEidwoVSlNPTlNjaGVtYVNpbXBsZVR5cGVzEgsKB1VOS05PV04QABIJCgVBUlJBWRABEgsKB0JPT0xFQU4QAhILCgdJTlRFR0VSEAMSCAoETlVMTBAEEgoKBk5VTUJFUhAFEgoKBk9CSkVDVBAGEgoKBlNUUklORxAHSgQIARACSgQIAhADSgQIBBAFSgQIEhATSgQIExAUSgQIFxAYSgQIGxAcSgQIHBAdSgQIHRAeSgQIHhAiSgQIJRAqSgQIKhArSgQIKxAuItkCCgNUYWcSEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgDIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEl4KCmV4dGVuc2lvbnMYBCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWcuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIvcBChNTZWN1cml0eURlZmluaXRpb25zEmgKCHNlY3VyaXR5GAEgAygLMkwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9ucy5TZWN1cml0eUVudHJ5UghzZWN1cml0eRp2Cg1TZWN1cml0eUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ek8KBXZhbHVlGAIgASgLMjkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWVSBXZhbHVlOgI4ASL/BgoOU2VjdXJpdHlTY2hlbWUSUgoEdHlwZRgBIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLlR5cGVSBHR5cGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhIKBG5hbWUYAyABKAlSBG5hbWUSTAoCaW4YBCABKA4yPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5JblICaW4SUgoEZmxvdxgFIAEoDjI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkZsb3dSBGZsb3cSKwoRYXV0aG9yaXphdGlvbl91cmwYBiABKAlSEGF1dGhvcml6YXRpb25VcmwSGwoJdG9rZW5fdXJsGAcgASgJUgh0b2tlblVybBJJCgZzY29wZXMYCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXNSBnNjb3BlcxJpCgpleHRlbnNpb25zGAkgAygLMkkuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIksKBFR5cGUSEAoMVFlQRV9JTlZBTElEEAASDgoKVFlQRV9CQVNJQxABEhAKDFRZUEVfQVBJX0tFWRACEg8KC1RZUEVfT0FVVEgyEAMiMQoCSW4SDgoKSU5fSU5WQUxJRBAAEgwKCElOX1FVRVJZEAESDQoJSU5fSEVBREVSEAIiagoERmxvdxIQCgxGTE9XX0lOVkFMSUQQABIRCg1GTE9XX0lNUExJQ0lUEAESEQoNRkxPV19QQVNTV09SRBACEhQKEEZMT1dfQVBQTElDQVRJT04QAxIUChBGTE9XX0FDQ0VTU19DT0RFEAQi9gIKE1NlY3VyaXR5UmVxdWlyZW1lbnQSigEKFHNlY3VyaXR5X3JlcXVpcmVtZW50GAEgAygLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50RW50cnlSE3NlY3VyaXR5UmVxdWlyZW1lbnQaMAoYU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlEhQKBXNjb3BlGAEgAygJUgVzY29wZRqfAQoYU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Em0KBXZhbHVlGAIgASgLMlcuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudC5TZWN1cml0eVJlcXVpcmVtZW50VmFsdWVSBXZhbHVlOgI4ASKWAQoGU2NvcGVzElIKBXNjb3BlGAEgAygLMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzLlNjb3BlRW50cnlSBXNjb3BlGjgKClNjb3BlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASo7CgZTY2hlbWUSCwoHVU5LTk9XThAAEggKBEhUVFAQARIJCgVIVFRQUxACEgYKAldTEAMSBwoDV1NTEARCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCv0GCi5wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL2Fubm90YXRpb25zLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvOn4KEW9wZW5hcGl2Ml9zd2FnZ2VyEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJIIIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXJSEG9wZW5hcGl2MlN3YWdnZXI6hgEKE29wZW5hcGl2Ml9vcGVyYXRpb24SHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiSCCABKAsyNC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb25SEm9wZW5hcGl2Mk9wZXJhdGlvbjp+ChBvcGVuYXBpdjJfc2NoZW1hEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJIIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIPb3BlbmFwaXYyU2NoZW1hOnUKDW9wZW5hcGl2Ml90YWcSHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMYkgggASgLMi4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnUgxvcGVuYXBpdjJUYWc6fgoPb3BlbmFwaXYyX2ZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiSCCABKAsyNS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hUg5vcGVuYXBpdjJGaWVsZEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK5gIKE3Byb3RvL3RhZy90YWcucHJvdG8SDWJ1Y2tldGVlci50YWciiAIKA1RhZxIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgEIAEoA1IJdXBkYXRlZEF0Ej4KC2VudGl0eV90eXBlGAUgASgOMh0uYnVja2V0ZWVyLnRhZy5UYWcuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIlCg5lbnZpcm9ubWVudF9pZBgGIAEoCVINZW52aXJvbm1lbnRJZCI4CgpFbnRpdHlUeXBlEgsKB1VOS05PV04QABIQCgxGRUFUVVJFX0ZMQUcQARILCgdBQ0NPVU5UEAJCLVorZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3RhZ2IGcHJvdG8zCpUVChdwcm90by90YWcvc2VydmljZS5wcm90bxINYnVja2V0ZWVyLnRhZxocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxofZ29vZ2xlL2FwaS9maWVsZF9iZWhhdmlvci5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxoTcHJvdG8vdGFnL3RhZy5wcm90byKcAQoQQ3JlYXRlVGFnUmVxdWVzdBIXCgRuYW1lGAEgASgJQgPgQQJSBG5hbWUSQwoLZW50aXR5X3R5cGUYAiABKA4yHS5idWNrZXRlZXIudGFnLlRhZy5FbnRpdHlUeXBlQgPgQQJSCmVudGl0eVR5cGUSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZCI5ChFDcmVhdGVUYWdSZXNwb25zZRIkCgN0YWcYASABKAsyEi5idWNrZXRlZXIudGFnLlRhZ1IDdGFnIlMKEERlbGV0ZVRhZ1JlcXVlc3QSEwoCaWQYASABKAlCA+BBAlICaWQSKgoOZW52aXJvbm1lbnRfaWQYAiABKAlCA+BBAlINZW52aXJvbm1lbnRJZCITChFEZWxldGVUYWdSZXNwb25zZSLnAwoPTGlzdFRhZ3NSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISQQoIb3JkZXJfYnkYBCABKA4yJi5idWNrZXRlZXIudGFnLkxpc3RUYWdzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5ElYKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjItLmJ1Y2tldGVlci50YWcuTGlzdFRhZ3NSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBIlCg5lbnZpcm9ubWVudF9pZBgHIAEoCVINZW52aXJvbm1lbnRJZBInCg9vcmdhbml6YXRpb25faWQYCCABKAlSDm9yZ2FuaXphdGlvbklkImIKB09yZGVyQnkSCwoHREVGQVVMVBAAEggKBE5BTUUQARIOCgpDUkVBVEVEX0FUEAISDgoKVVBEQVRFRF9BVBADEg8KC0VOVElUWV9UWVBFEAQSDwoLRU5WSVJPTk1FTlQQBSIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAFKBAgBEAIicwoQTGlzdFRhZ3NSZXNwb25zZRImCgR0YWdzGAEgAygLMhIuYnVja2V0ZWVyLnRhZy5UYWdSBHRhZ3MSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQyjAwKClRhZ1NlcnZpY2US9gMKCExpc3RUYWdzEh4uYnVja2V0ZWVyLnRhZy5MaXN0VGFnc1JlcXVlc3QaHy5idWNrZXRlZXIudGFnLkxpc3RUYWdzUmVzcG9uc2UiqAOSQZQDCgN0YWcSBExpc3QaCkxpc3QgdGFncy4qD3dlYi52MS50YWcubGlzdEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgoSCC92MS90YWdzEoIECglDcmVhdGVUYWcSHy5idWNrZXRlZXIudGFnLkNyZWF0ZVRhZ1JlcXVlc3QaIC5idWNrZXRlZXIudGFnLkNyZWF0ZVRhZ1Jlc3BvbnNlIrEDkkGbAwoDdGFnEgZDcmVhdGUaDUNyZWF0ZSBhIHRhZy4qEXdlYi52MS50YWcuY3JlYXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCDCIHL3YxL3RhZzoBKhL/AwoJRGVsZXRlVGFnEh8uYnVja2V0ZWVyLnRhZy5EZWxldGVUYWdSZXF1ZXN0GiAuYnVja2V0ZWVyLnRhZy5EZWxldGVUYWdSZXNwb25zZSKuA5JBmwMKA3RhZxIGRGVsZXRlGg1EZWxldGUgYSB0YWcuKhF3ZWIudjEudGFnLmRlbGV0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgkqBy92MS90YWdCLVorZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3RhZ2IGcHJvdG8z
+ tagDescriptor: CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwroAwofZ29vZ2xlL2FwaS9maWVsZF9iZWhhdmlvci5wcm90bxIKZ29vZ2xlLmFwaRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8qtgEKDUZpZWxkQmVoYXZpb3ISHgoaRklFTERfQkVIQVZJT1JfVU5TUEVDSUZJRUQQABIMCghPUFRJT05BTBABEgwKCFJFUVVJUkVEEAISDwoLT1VUUFVUX09OTFkQAxIOCgpJTlBVVF9PTkxZEAQSDQoJSU1NVVRBQkxFEAUSEgoOVU5PUkRFUkVEX0xJU1QQBhIVChFOT05fRU1QVFlfREVGQVVMVBAHEg4KCklERU5USUZJRVIQCDpkCg5maWVsZF9iZWhhdmlvchIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYnAggAygOMhkuZ29vZ2xlLmFwaS5GaWVsZEJlaGF2aW9yQgIQAFINZmllbGRCZWhhdmlvckJwCg5jb20uZ29vZ2xlLmFwaUISRmllbGRCZWhhdmlvclByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIER0FQSWIGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwrLAwoTcHJvdG8vdGFnL3RhZy5wcm90bxINYnVja2V0ZWVyLnRhZyKMAgoDVGFnEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmNyZWF0ZWRfYXQYAyABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAQgASgDUgl1cGRhdGVkQXQSPgoLZW50aXR5X3R5cGUYBSABKA4yHS5idWNrZXRlZXIudGFnLlRhZy5FbnRpdHlUeXBlUgplbnRpdHlUeXBlEiUKDmVudmlyb25tZW50X2lkGAYgASgJUg1lbnZpcm9ubWVudElkIjwKCkVudGl0eVR5cGUSDwoLVU5TUEVDSUZJRUQQABIQCgxGRUFUVVJFX0ZMQUcQARILCgdBQ0NPVU5UEAIiXwoORW52aXJvbm1lbnRUYWcSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSJgoEdGFncxgCIAMoCzISLmJ1Y2tldGVlci50YWcuVGFnUgR0YWdzQi1aK2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by90YWdiBnByb3RvMwr1FQoXcHJvdG8vdGFnL3NlcnZpY2UucHJvdG8SDWJ1Y2tldGVlci50YWcaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9hcGkvZmllbGRfYmVoYXZpb3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxoTcHJvdG8vdGFnL3RhZy5wcm90byKcAQoQQ3JlYXRlVGFnUmVxdWVzdBIXCgRuYW1lGAEgASgJQgPgQQJSBG5hbWUSQwoLZW50aXR5X3R5cGUYAiABKA4yHS5idWNrZXRlZXIudGFnLlRhZy5FbnRpdHlUeXBlQgPgQQJSCmVudGl0eVR5cGUSKgoOZW52aXJvbm1lbnRfaWQYAyABKAlCA+BBAlINZW52aXJvbm1lbnRJZCI5ChFDcmVhdGVUYWdSZXNwb25zZRIkCgN0YWcYASABKAsyEi5idWNrZXRlZXIudGFnLlRhZ1IDdGFnIlMKEERlbGV0ZVRhZ1JlcXVlc3QSEwoCaWQYASABKAlCA+BBAlICaWQSKgoOZW52aXJvbm1lbnRfaWQYAiABKAlCA+BBAlINZW52aXJvbm1lbnRJZCITChFEZWxldGVUYWdSZXNwb25zZSKnBAoPTGlzdFRhZ3NSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISQQoIb3JkZXJfYnkYBCABKA4yJi5idWNrZXRlZXIudGFnLkxpc3RUYWdzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5ElYKD29yZGVyX2RpcmVjdGlvbhgFIAEoDjItLmJ1Y2tldGVlci50YWcuTGlzdFRhZ3NSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBIlCg5lbnZpcm9ubWVudF9pZBgHIAEoCVINZW52aXJvbm1lbnRJZBInCg9vcmdhbml6YXRpb25faWQYCCABKAlSDm9yZ2FuaXphdGlvbklkEj4KC2VudGl0eV90eXBlGAkgASgOMh0uYnVja2V0ZWVyLnRhZy5UYWcuRW50aXR5VHlwZVIKZW50aXR5VHlwZSJiCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAxIPCgtFTlRJVFlfVFlQRRAEEg8KC0VOVklST05NRU5UEAUiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABSgQIARACInMKEExpc3RUYWdzUmVzcG9uc2USJgoEdGFncxgBIAMoCzISLmJ1Y2tldGVlci50YWcuVGFnUgR0YWdzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50MowMCgpUYWdTZXJ2aWNlEvYDCghMaXN0VGFncxIeLmJ1Y2tldGVlci50YWcuTGlzdFRhZ3NSZXF1ZXN0Gh8uYnVja2V0ZWVyLnRhZy5MaXN0VGFnc1Jlc3BvbnNlIqgDkkGUAwoDdGFnEgRMaXN0GgpMaXN0IHRhZ3MuKg93ZWIudjEudGFnLmxpc3RKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIKEggvdjEvdGFncxKCBAoJQ3JlYXRlVGFnEh8uYnVja2V0ZWVyLnRhZy5DcmVhdGVUYWdSZXF1ZXN0GiAuYnVja2V0ZWVyLnRhZy5DcmVhdGVUYWdSZXNwb25zZSKxA5JBmwMKA3RhZxIGQ3JlYXRlGg1DcmVhdGUgYSB0YWcuKhF3ZWIudjEudGFnLmNyZWF0ZUq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAgwiBy92MS90YWc6ASoS/wMKCURlbGV0ZVRhZxIfLmJ1Y2tldGVlci50YWcuRGVsZXRlVGFnUmVxdWVzdBogLmJ1Y2tldGVlci50YWcuRGVsZXRlVGFnUmVzcG9uc2UirgOSQZsDCgN0YWcSBkRlbGV0ZRoNRGVsZXRlIGEgdGFnLioRd2ViLnYxLnRhZy5kZWxldGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIJKgcvdjEvdGFnQi1aK2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by90YWdiBnByb3RvMw==
+ coderefDescriptor: CrcGCiJwcm90by9jb2RlcmVmL2NvZGVfcmVmZXJlbmNlLnByb3RvEhFidWNrZXRlZXIuY29kZXJlZiLCBQoNQ29kZVJlZmVyZW5jZRIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEhsKCWZpbGVfcGF0aBgDIAEoCVIIZmlsZVBhdGgSHwoLbGluZV9udW1iZXIYBCABKAVSCmxpbmVOdW1iZXISIQoMY29kZV9zbmlwcGV0GAUgASgJUgtjb2RlU25pcHBldBIhCgxjb250ZW50X2hhc2gYBiABKAlSC2NvbnRlbnRIYXNoEhgKB2FsaWFzZXMYByADKAlSB2FsaWFzZXMSJwoPcmVwb3NpdG9yeV9uYW1lGAggASgJUg5yZXBvc2l0b3J5TmFtZRIpChByZXBvc2l0b3J5X293bmVyGAkgASgJUg9yZXBvc2l0b3J5T3duZXISWAoPcmVwb3NpdG9yeV90eXBlGAogASgOMi8uYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZS5SZXBvc2l0b3J5VHlwZVIOcmVwb3NpdG9yeVR5cGUSKwoRcmVwb3NpdG9yeV9icmFuY2gYCyABKAlSEHJlcG9zaXRvcnlCcmFuY2gSHwoLY29tbWl0X2hhc2gYDCABKAlSCmNvbW1pdEhhc2gSJQoOZW52aXJvbm1lbnRfaWQYDSABKAlSDWVudmlyb25tZW50SWQSHQoKY3JlYXRlZF9hdBgOIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYDyABKANSCXVwZGF0ZWRBdBIdCgpzb3VyY2VfdXJsGBAgASgJUglzb3VyY2VVcmwiZAoOUmVwb3NpdG9yeVR5cGUSHwobUkVQT1NJVE9SWV9UWVBFX1VOU1BFQ0lGSUVEEAASCgoGR0lUSFVCEAESCgoGR0lUTEFCEAISDQoJQklUQlVDS0VUEAMSCgoGQ1VTVE9NEARCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2NvZGVyZWZiBnByb3RvMwqHBQoVZ29vZ2xlL2FwaS9odHRwLnByb3RvEgpnb29nbGUuYXBpInkKBEh0dHASKgoFcnVsZXMYASADKAsyFC5nb29nbGUuYXBpLkh0dHBSdWxlUgVydWxlcxJFCh9mdWxseV9kZWNvZGVfcmVzZXJ2ZWRfZXhwYW5zaW9uGAIgASgIUhxmdWxseURlY29kZVJlc2VydmVkRXhwYW5zaW9uIrUCCghIdHRwUnVsZRIaCghzZWxlY3RvchgBIAEoCVIIc2VsZWN0b3ISEgoDZ2V0GAIgASgJSABSA2dldBISCgNwdXQYAyABKAlIAFIDcHV0EhQKBHBvc3QYBCABKAlIAFIEcG9zdBIYCgZkZWxldGUYBSABKAlIAFIGZGVsZXRlEhYKBXBhdGNoGAYgASgJSABSBXBhdGNoEjcKBmN1c3RvbRgIIAEoCzIdLmdvb2dsZS5hcGkuQ3VzdG9tSHR0cFBhdHRlcm5IAFIGY3VzdG9tEhIKBGJvZHkYByABKAlSBGJvZHkSRQoTYWRkaXRpb25hbF9iaW5kaW5ncxgLIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSEmFkZGl0aW9uYWxCaW5kaW5nc0IJCgdwYXR0ZXJuIjsKEUN1c3RvbUh0dHBQYXR0ZXJuEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEcGF0aBgCIAEoCVIEcGF0aEJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8zCuFGCiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIk0KEUZpbGVEZXNjcmlwdG9yU2V0EjgKBGZpbGUYASADKAsyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1IEZmlsZSL+BAoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIYCgdlZGl0aW9uGA0gASgJUgdlZGl0aW9uIrkGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUaegoORXh0ZW5zaW9uUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kEkAKB29wdGlvbnMYAyABKAsyJi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zUgdvcHRpb25zGjcKDVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIq0EChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24SWQoLZGVjbGFyYXRpb24YAiADKAsyMi5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uQgOIAQJSC2RlY2xhcmF0aW9uEmgKDHZlcmlmaWNhdGlvbhgDIAEoDjI4Lmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGU6ClVOVkVSSUZJRURSDHZlcmlmaWNhdGlvbhqzAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEiMKC2lzX3JlcGVhdGVkGAQgASgIQgIYAVIKaXNSZXBlYXRlZBIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFURUQQAyJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIpEJCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxI3ChRwaHBfZ2VuZXJpY19zZXJ2aWNlcxgqIAEoCDoFZmFsc2VSEnBocEdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECciuwMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKFCQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJKCgZ0YXJnZXQYEiABKA4yLi5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblRhcmdldFR5cGVCAhgBUgZ0YXJnZXQSSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFInMKDE9uZW9mT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpgCCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLQAgoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGusBCgpBbm5vdGF0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEh8KC3NvdXJjZV9maWxlGAIgASgJUgpzb3VyY2VGaWxlEhQKBWJlZ2luGAMgASgFUgViZWdpbhIQCgNlbmQYBCABKAVSA2VuZBJSCghzZW1hbnRpYxgFIAEoDjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLlNlbWFudGljUghzZW1hbnRpYyIoCghTZW1hbnRpYxIICgROT05FEAASBwoDU0VUEAESCQoFQUxJQVMQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCqgCChxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpGhVnb29nbGUvYXBpL2h0dHAucHJvdG8aIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzMK4gUKHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiKYAQoGU3RydWN0EjsKBmZpZWxkcxgBIAMoCzIjLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnlSBmZpZWxkcxpRCgtGaWVsZHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIrICCgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5kIjsKCUxpc3RWYWx1ZRIuCgZ2YWx1ZXMYASADKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBnZhbHVlcyobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKpj4KLHByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvb3BlbmFwaXYyLnByb3RvEilncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucxocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byKzCAoHU3dhZ2dlchIYCgdzd2FnZ2VyGAEgASgJUgdzd2FnZ2VyEkMKBGluZm8YAiABKAsyLy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5JbmZvUgRpbmZvEhIKBGhvc3QYAyABKAlSBGhvc3QSGwoJYmFzZV9wYXRoGAQgASgJUghiYXNlUGF0aBJLCgdzY2hlbWVzGAUgAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSXwoJcmVzcG9uc2VzGAogAygLMkEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlci5SZXNwb25zZXNFbnRyeVIJcmVzcG9uc2VzEnEKFHNlY3VyaXR5X2RlZmluaXRpb25zGAsgASgLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlEZWZpbml0aW9uc1ITc2VjdXJpdHlEZWZpbml0aW9ucxJaCghzZWN1cml0eRgMIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnRSCHNlY3VyaXR5EkIKBHRhZ3MYDSADKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSBHRhZ3MSZQoNZXh0ZXJuYWxfZG9jcxgOIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEmIKCmV4dGVuc2lvbnMYDyADKAsyQi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAlKBAgJEAoi1gcKCU9wZXJhdGlvbhISCgR0YWdzGAEgAygJUgR0YWdzEhgKB3N1bW1hcnkYAiABKAlSB3N1bW1hcnkSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYBCABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIhCgxvcGVyYXRpb25faWQYBSABKAlSC29wZXJhdGlvbklkEhoKCGNvbnN1bWVzGAYgAygJUghjb25zdW1lcxIaCghwcm9kdWNlcxgHIAMoCVIIcHJvZHVjZXMSYQoJcmVzcG9uc2VzGAkgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMSSwoHc2NoZW1lcxgKIAMoDjIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtZVIHc2NoZW1lcxIeCgpkZXByZWNhdGVkGAsgASgIUgpkZXByZWNhdGVkEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSZAoKZXh0ZW5zaW9ucxgNIAMoCzJELmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvbi5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMSVQoKcGFyYW1ldGVycxgOIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlBhcmFtZXRlcnNSCnBhcmFtZXRlcnMacQoOUmVzcG9uc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBSgQICBAJImIKClBhcmFtZXRlcnMSVAoHaGVhZGVycxgBIAMoCzI6LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlclIHaGVhZGVycyKjAgoPSGVhZGVyUGFyYW1ldGVyEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uElMKBHR5cGUYAyABKA4yPy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5IZWFkZXJQYXJhbWV0ZXIuVHlwZVIEdHlwZRIWCgZmb3JtYXQYBCABKAlSBmZvcm1hdBIaCghyZXF1aXJlZBgFIAEoCFIIcmVxdWlyZWQiRQoEVHlwZRILCgdVTktOT1dOEAASCgoGU1RSSU5HEAESCgoGTlVNQkVSEAISCwoHSU5URUdFUhADEgsKB0JPT0xFQU4QBEoECAYQB0oECAcQCCLYAQoGSGVhZGVyEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhISCgR0eXBlGAIgASgJUgR0eXBlEhYKBmZvcm1hdBgDIAEoCVIGZm9ybWF0EhgKB2RlZmF1bHQYBiABKAlSB2RlZmF1bHQSGAoHcGF0dGVybhgNIAEoCVIHcGF0dGVybkoECAQQBUoECAUQBkoECAcQCEoECAgQCUoECAkQCkoECAoQC0oECAsQDEoECAwQDUoECA4QD0oECA8QEEoECBAQEUoECBEQEkoECBIQEyKaBQoIUmVzcG9uc2USIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEkkKBnNjaGVtYRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjaGVtYVIGc2NoZW1hEloKB2hlYWRlcnMYAyADKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5IZWFkZXJzRW50cnlSB2hlYWRlcnMSXQoIZXhhbXBsZXMYBCADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeGFtcGxlc0VudHJ5UghleGFtcGxlcxJjCgpleHRlbnNpb25zGAUgAygLMkMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2UuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGm0KDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJHCgV2YWx1ZRgCIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclIFdmFsdWU6AjgBGjsKDUV4YW1wbGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASLWAwoESW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEigKEHRlcm1zX29mX3NlcnZpY2UYAyABKAlSDnRlcm1zT2ZTZXJ2aWNlEkwKB2NvbnRhY3QYBCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Db250YWN0Ugdjb250YWN0EkwKB2xpY2Vuc2UYBSABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5MaWNlbnNlUgdsaWNlbnNlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24SXwoKZXh0ZW5zaW9ucxgHIAMoCzI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm8uRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIkUKB0NvbnRhY3QSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybBIUCgVlbWFpbBgDIAEoCVIFZW1haWwiLwoHTGljZW5zZRISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsIksKFUV4dGVybmFsRG9jdW1lbnRhdGlvbhIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SEAoDdXJsGAIgASgJUgN1cmwiqgIKBlNjaGVtYRJWCgtqc29uX3NjaGVtYRgBIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSCmpzb25TY2hlbWESJAoNZGlzY3JpbWluYXRvchgCIAEoCVINZGlzY3JpbWluYXRvchIbCglyZWFkX29ubHkYAyABKAhSCHJlYWRPbmx5EmUKDWV4dGVybmFsX2RvY3MYBSABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxIYCgdleGFtcGxlGAYgASgJUgdleGFtcGxlSgQIBBAFItcKCgpKU09OU2NoZW1hEhAKA3JlZhgDIAEoCVIDcmVmEhQKBXRpdGxlGAUgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SGAoHZGVmYXVsdBgHIAEoCVIHZGVmYXVsdBIbCglyZWFkX29ubHkYCCABKAhSCHJlYWRPbmx5EhgKB2V4YW1wbGUYCSABKAlSB2V4YW1wbGUSHwoLbXVsdGlwbGVfb2YYCiABKAFSCm11bHRpcGxlT2YSGAoHbWF4aW11bRgLIAEoAVIHbWF4aW11bRIrChFleGNsdXNpdmVfbWF4aW11bRgMIAEoCFIQZXhjbHVzaXZlTWF4aW11bRIYCgdtaW5pbXVtGA0gASgBUgdtaW5pbXVtEisKEWV4Y2x1c2l2ZV9taW5pbXVtGA4gASgIUhBleGNsdXNpdmVNaW5pbXVtEh0KCm1heF9sZW5ndGgYDyABKARSCW1heExlbmd0aBIdCgptaW5fbGVuZ3RoGBAgASgEUgltaW5MZW5ndGgSGAoHcGF0dGVybhgRIAEoCVIHcGF0dGVybhIbCgltYXhfaXRlbXMYFCABKARSCG1heEl0ZW1zEhsKCW1pbl9pdGVtcxgVIAEoBFIIbWluSXRlbXMSIQoMdW5pcXVlX2l0ZW1zGBYgASgIUgt1bmlxdWVJdGVtcxIlCg5tYXhfcHJvcGVydGllcxgYIAEoBFINbWF4UHJvcGVydGllcxIlCg5taW5fcHJvcGVydGllcxgZIAEoBFINbWluUHJvcGVydGllcxIaCghyZXF1aXJlZBgaIAMoCVIIcmVxdWlyZWQSFAoFYXJyYXkYIiADKAlSBWFycmF5El8KBHR5cGUYIyADKA4ySy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkpTT05TY2hlbWFTaW1wbGVUeXBlc1IEdHlwZRIWCgZmb3JtYXQYJCABKAlSBmZvcm1hdBISCgRlbnVtGC4gAygJUgRlbnVtEnoKE2ZpZWxkX2NvbmZpZ3VyYXRpb24Y6QcgASgLMkguZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5GaWVsZENvbmZpZ3VyYXRpb25SEmZpZWxkQ29uZmlndXJhdGlvbhJlCgpleHRlbnNpb25zGDAgAygLMkUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaPAoSRmllbGRDb25maWd1cmF0aW9uEiYKD3BhdGhfcGFyYW1fbmFtZRgvIAEoCVINcGF0aFBhcmFtTmFtZRpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJ3ChVKU09OU2NoZW1hU2ltcGxlVHlwZXMSCwoHVU5LTk9XThAAEgkKBUFSUkFZEAESCwoHQk9PTEVBThACEgsKB0lOVEVHRVIQAxIICgROVUxMEAQSCgoGTlVNQkVSEAUSCgoGT0JKRUNUEAYSCgoGU1RSSU5HEAdKBAgBEAJKBAgCEANKBAgEEAVKBAgSEBNKBAgTEBRKBAgXEBhKBAgbEBxKBAgcEB1KBAgdEB5KBAgeECJKBAglECpKBAgqECtKBAgrEC4i2QIKA1RhZxISCgRuYW1lGAEgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhJlCg1leHRlcm5hbF9kb2NzGAMgASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSXgoKZXh0ZW5zaW9ucxgEIAMoCzI+LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZy5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEi9wEKE1NlY3VyaXR5RGVmaW5pdGlvbnMSaAoIc2VjdXJpdHkYASADKAsyTC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zLlNlY3VyaXR5RW50cnlSCHNlY3VyaXR5GnYKDVNlY3VyaXR5RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSTwoFdmFsdWUYAiABKAsyOS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZVIFdmFsdWU6AjgBIv8GCg5TZWN1cml0eVNjaGVtZRJSCgR0eXBlGAEgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuVHlwZVIEdHlwZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SEgoEbmFtZRgDIAEoCVIEbmFtZRJMCgJpbhgEIAEoDjI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkluUgJpbhJSCgRmbG93GAUgASgOMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuRmxvd1IEZmxvdxIrChFhdXRob3JpemF0aW9uX3VybBgGIAEoCVIQYXV0aG9yaXphdGlvblVybBIbCgl0b2tlbl91cmwYByABKAlSCHRva2VuVXJsEkkKBnNjb3BlcxgIIAEoCzIxLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blc1IGc2NvcGVzEmkKCmV4dGVuc2lvbnMYCSADKAsySS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiSwoEVHlwZRIQCgxUWVBFX0lOVkFMSUQQABIOCgpUWVBFX0JBU0lDEAESEAoMVFlQRV9BUElfS0VZEAISDwoLVFlQRV9PQVVUSDIQAyIxCgJJbhIOCgpJTl9JTlZBTElEEAASDAoISU5fUVVFUlkQARINCglJTl9IRUFERVIQAiJqCgRGbG93EhAKDEZMT1dfSU5WQUxJRBAAEhEKDUZMT1dfSU1QTElDSVQQARIRCg1GTE9XX1BBU1NXT1JEEAISFAoQRkxPV19BUFBMSUNBVElPThADEhQKEEZMT1dfQUNDRVNTX0NPREUQBCL2AgoTU2VjdXJpdHlSZXF1aXJlbWVudBKKAQoUc2VjdXJpdHlfcmVxdWlyZW1lbnQYASADKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeVITc2VjdXJpdHlSZXF1aXJlbWVudBowChhTZWN1cml0eVJlcXVpcmVtZW50VmFsdWUSFAoFc2NvcGUYASADKAlSBXNjb3BlGp8BChhTZWN1cml0eVJlcXVpcmVtZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSbQoFdmFsdWUYAiABKAsyVy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50LlNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZVIFdmFsdWU6AjgBIpYBCgZTY29wZXMSUgoFc2NvcGUYASADKAsyPC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY29wZXMuU2NvcGVFbnRyeVIFc2NvcGUaOAoKU2NvcGVFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBKjsKBlNjaGVtZRILCgdVTktOT1dOEAASCAoESFRUUBABEgkKBUhUVFBTEAISBgoCV1MQAxIHCgNXU1MQBEJIWkZnaXRodWIuY29tL2dycGMtZWNvc3lzdGVtL2dycGMtZ2F0ZXdheS92Mi9wcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zYgZwcm90bzMK/QYKLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG86fgoRb3BlbmFwaXYyX3N3YWdnZXISHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYkgggASgLMjIuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU3dhZ2dlclIQb3BlbmFwaXYyU3dhZ2dlcjqGAQoTb3BlbmFwaXYyX29wZXJhdGlvbhIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJIIIAEoCzI0LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLk9wZXJhdGlvblISb3BlbmFwaXYyT3BlcmF0aW9uOn4KEG9wZW5hcGl2Ml9zY2hlbWESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkgggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUg9vcGVuYXBpdjJTY2hlbWE6dQoNb3BlbmFwaXYyX3RhZxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiSCCABKAsyLi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5UYWdSDG9wZW5hcGl2MlRhZzp+Cg9vcGVuYXBpdjJfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJIIIAEoCzI1LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWFSDm9wZW5hcGl2MkZpZWxkQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwqxMgobcHJvdG8vY29kZXJlZi9zZXJ2aWNlLnByb3RvEhFidWNrZXRlZXIuY29kZXJlZhoicHJvdG8vY29kZXJlZi9jb2RlX3JlZmVyZW5jZS5wcm90bxocZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wcm90bxoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90byJQChdHZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSJQoOZW52aXJvbm1lbnRfaWQYAiABKAlSDWVudmlyb25tZW50SWQiYwoYR2V0Q29kZVJlZmVyZW5jZVJlc3BvbnNlEkcKDmNvZGVfcmVmZXJlbmNlGAEgASgLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVINY29kZVJlZmVyZW5jZSKsBQoZTGlzdENvZGVSZWZlcmVuY2VzUmVxdWVzdBIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPcmVwb3NpdG9yeV9uYW1lGAMgASgJUg5yZXBvc2l0b3J5TmFtZRIpChByZXBvc2l0b3J5X293bmVyGAQgASgJUg9yZXBvc2l0b3J5T3duZXISWAoPcmVwb3NpdG9yeV90eXBlGAUgASgOMi8uYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZS5SZXBvc2l0b3J5VHlwZVIOcmVwb3NpdG9yeVR5cGUSKwoRcmVwb3NpdG9yeV9icmFuY2gYBiABKAlSEHJlcG9zaXRvcnlCcmFuY2gSFgoGY3Vyc29yGAcgASgJUgZjdXJzb3ISGwoJcGFnZV9zaXplGAggASgDUghwYWdlU2l6ZRJPCghvcmRlcl9ieRgJIAEoDjI0LmJ1Y2tldGVlci5jb2RlcmVmLkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJkCg9vcmRlcl9kaXJlY3Rpb24YCiABKA4yOy5idWNrZXRlZXIuY29kZXJlZi5MaXN0Q29kZVJlZmVyZW5jZXNSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5maWxlX2V4dGVuc2lvbhgLIAEoCVINZmlsZUV4dGVuc2lvbiI2CgdPcmRlckJ5EgsKB0RFRkFVTFQQABIOCgpDUkVBVEVEX0FUEAESDgoKVVBEQVRFRF9BVBACIiMKDk9yZGVyRGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQASKgAQoaTGlzdENvZGVSZWZlcmVuY2VzUmVzcG9uc2USSQoPY29kZV9yZWZlcmVuY2VzGAEgAygLMiAuYnVja2V0ZWVyLmNvZGVyZWYuQ29kZVJlZmVyZW5jZVIOY29kZVJlZmVyZW5jZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQi/AMKGkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoImYKG0NyZWF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2Ui7QMKGlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBIbCglmaWxlX3BhdGgYAyABKAlSCGZpbGVQYXRoEh8KC2xpbmVfbnVtYmVyGAQgASgFUgpsaW5lTnVtYmVyEiEKDGNvZGVfc25pcHBldBgFIAEoCVILY29kZVNuaXBwZXQSIQoMY29udGVudF9oYXNoGAYgASgJUgtjb250ZW50SGFzaBIYCgdhbGlhc2VzGAcgAygJUgdhbGlhc2VzEicKD3JlcG9zaXRvcnlfbmFtZRgIIAEoCVIOcmVwb3NpdG9yeU5hbWUSKQoQcmVwb3NpdG9yeV9vd25lchgJIAEoCVIPcmVwb3NpdG9yeU93bmVyElgKD3JlcG9zaXRvcnlfdHlwZRgKIAEoDjIvLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2UuUmVwb3NpdG9yeVR5cGVSDnJlcG9zaXRvcnlUeXBlEisKEXJlcG9zaXRvcnlfYnJhbmNoGAsgASgJUhByZXBvc2l0b3J5QnJhbmNoEh8KC2NvbW1pdF9oYXNoGAwgASgJUgpjb21taXRIYXNoImYKG1VwZGF0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZRJHCg5jb2RlX3JlZmVyZW5jZRgBIAEoCzIgLmJ1Y2tldGVlci5jb2RlcmVmLkNvZGVSZWZlcmVuY2VSDWNvZGVSZWZlcmVuY2UiUwoaRGVsZXRlQ29kZVJlZmVyZW5jZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkIh0KG0RlbGV0ZUNvZGVSZWZlcmVuY2VSZXNwb25zZTKVHgoUQ29kZVJlZmVyZW5jZVNlcnZpY2US9wUKEEdldENvZGVSZWZlcmVuY2USKi5idWNrZXRlZXIuY29kZXJlZi5HZXRDb2RlUmVmZXJlbmNlUmVxdWVzdBorLmJ1Y2tldGVlci5jb2RlcmVmLkdldENvZGVSZWZlcmVuY2VSZXNwb25zZSKJBZJB5QQKDkNvZGUgUmVmZXJlbmNlEgNHZXQaG0dldCBhIGNvZGUgcmVmZXJlbmNlIGJ5IElELioZd2ViLnYxLmNvZGVfcmVmZXJlbmNlLmdldEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH1KqQEKAzQwMxKhAQo4UmVxdWVzdCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXNvdXJjZS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiTQoQYXBwbGljYXRpb24vanNvbhI5eyAiY29kZSI6IDcsICJtZXNzYWdlIjogIm5vdCBhdXRob3JpemVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIaEhgvdjEvY29kZV9yZWZlcmVuY2VzL3tpZH0S4AQKEkxpc3RDb2RlUmVmZXJlbmNlcxIsLmJ1Y2tldGVlci5jb2RlcmVmLkxpc3RDb2RlUmVmZXJlbmNlc1JlcXVlc3QaLS5idWNrZXRlZXIuY29kZXJlZi5MaXN0Q29kZVJlZmVyZW5jZXNSZXNwb25zZSLsA5JBzQMKDkNvZGUgUmVmZXJlbmNlEgRMaXN0Gi1MaXN0IGNvZGUgcmVmZXJlbmNlcyB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZy4qGndlYi52MS5jb2RlX3JlZmVyZW5jZS5saXN0SrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCFRITL3YxL2NvZGVfcmVmZXJlbmNlcxKwBgoTQ3JlYXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5jb2RlcmVmLkNyZWF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmNvZGVyZWYuQ3JlYXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIrkFkkGXBQoOQ29kZSBSZWZlcmVuY2USBkNyZWF0ZRpHQ3JlYXRlIGEgbmV3IGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgcm9sZS4qHHdlYi52MS5jb2RlX3JlZmVyZW5jZS5jcmVhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCGCITL3YxL2NvZGVfcmVmZXJlbmNlczoBKhK7BgoTVXBkYXRlQ29kZVJlZmVyZW5jZRItLmJ1Y2tldGVlci5jb2RlcmVmLlVwZGF0ZUNvZGVSZWZlcmVuY2VSZXF1ZXN0Gi4uYnVja2V0ZWVyLmNvZGVyZWYuVXBkYXRlQ29kZVJlZmVyZW5jZVJlc3BvbnNlIsQFkkGdBQoOQ29kZSBSZWZlcmVuY2USBlVwZGF0ZRpNVXBkYXRlIGFuIGV4aXN0aW5nIGNvZGUgcmVmZXJlbmNlLiBUbyBjYWxsIHRoaXMgQVBJLCB5b3UgbmVlZCBhIGBXUklURWAgcm9sZS4qHHdlYi52MS5jb2RlX3JlZmVyZW5jZS51cGRhdGVKtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9SqkBCgM0MDMSoQEKOFJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIk0KEGFwcGxpY2F0aW9uL2pzb24SOXsgImNvZGUiOiA3LCAibWVzc2FnZSI6ICJub3QgYXV0aG9yaXplZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHTIYL3YxL2NvZGVfcmVmZXJlbmNlcy97aWR9OgEqEq4GChNEZWxldGVDb2RlUmVmZXJlbmNlEi0uYnVja2V0ZWVyLmNvZGVyZWYuRGVsZXRlQ29kZVJlZmVyZW5jZVJlcXVlc3QaLi5idWNrZXRlZXIuY29kZXJlZi5EZWxldGVDb2RlUmVmZXJlbmNlUmVzcG9uc2UitwWSQZMFCg5Db2RlIFJlZmVyZW5jZRIGRGVsZXRlGkNEZWxldGUgYSBjb2RlIHJlZmVyZW5jZS4gVG8gY2FsbCB0aGlzIEFQSSwgeW91IG5lZWQgYSBgV1JJVEVgIHJvbGUuKhx3ZWIudjEuY29kZV9yZWZlcmVuY2UuZGVsZXRlSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfUqpAQoDNDAzEqEBCjhSZXF1ZXN0IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlc291cmNlLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJNChBhcHBsaWNhdGlvbi9qc29uEjl7ICJjb2RlIjogNywgIm1lc3NhZ2UiOiAibm90IGF1dGhvcml6ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhoqGC92MS9jb2RlX3JlZmVyZW5jZXMve2lkfUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vY29kZXJlZmIGcHJvdG8z
service:
type: ClusterIP
grpcPort: 9000
diff --git a/manifests/bucketeer/values.dev.yaml b/manifests/bucketeer/values.dev.yaml
index 8a7e812e95..696dd15816 100644
--- a/manifests/bucketeer/values.dev.yaml
+++ b/manifests/bucketeer/values.dev.yaml
@@ -237,6 +237,9 @@ batch-server:
- name: auto-ops-rules-cacher
jobId: AutoOpsRulesCacher
schedule: "* * * * *"
+ - name: tag-deleter
+ jobId: TagDeleter
+ schedule: "* * * * *"
subscriber:
env:
diff --git a/manifests/bucketeer/values.yaml b/manifests/bucketeer/values.yaml
index 1c460c9be4..5ff1ed74ea 100644
--- a/manifests/bucketeer/values.yaml
+++ b/manifests/bucketeer/values.yaml
@@ -1,12 +1,12 @@
global:
image:
- tag: v1.1.0 # x-release-please-version
+ tag: v1.2.0 # x-release-please-version
imagePullSecrets:
migration:
image:
repository: ghcr.io/bucketeer-io/bucketeer-migration
- tag: v1.1.0 # x-release-please-version
+ tag: v1.2.0 # x-release-please-version
imagePullSecrets: []
diff --git a/migration/mysql/20250116060049_update_goal_table.sql b/migration/mysql/20250116060049_update_goal_table.sql
new file mode 100644
index 0000000000..5d922ec64c
--- /dev/null
+++ b/migration/mysql/20250116060049_update_goal_table.sql
@@ -0,0 +1 @@
+ALTER TABLE `goal` ADD COLUMN `connection_type` INT NOT NULL DEFAULT 0 AFTER `description`;
diff --git a/migration/mysql/20250122261735_add_code_ref_table.sql b/migration/mysql/20250122261735_add_code_ref_table.sql
new file mode 100644
index 0000000000..c90e565dd5
--- /dev/null
+++ b/migration/mysql/20250122261735_add_code_ref_table.sql
@@ -0,0 +1,21 @@
+CREATE TABLE code_reference (
+ id varchar(255) NOT NULL,
+ feature_id VARCHAR(255) NOT NULL,
+ file_path VARCHAR(512) NOT NULL,
+ line_number INT NOT NULL,
+ code_snippet TEXT NOT NULL,
+ content_hash VARCHAR(64) NOT NULL,
+ aliases JSON,
+ repository_name VARCHAR(255) NOT NULL,
+ repository_owner VARCHAR(255) NOT NULL,
+ repository_type TINYINT NOT NULL COMMENT '0:UNSPECIFIED, 1:GITHUB, 2:GITLAB, 3:BITBUCKET, 4:CUSTOM',
+ repository_branch VARCHAR(255) NOT NULL,
+ commit_hash VARCHAR(40) NOT NULL,
+ environment_id VARCHAR(255) NOT NULL,
+ created_at BIGINT NOT NULL,
+ updated_at BIGINT NOT NULL,
+ PRIMARY KEY (id),
+ INDEX idx_file_path (file_path),
+ CONSTRAINT foreign_code_references_feature FOREIGN KEY (feature_id, environment_id)
+ REFERENCES feature (id, environment_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/migration/mysql/atlas.sum b/migration/mysql/atlas.sum
index 68b39385ae..ad2dbd196c 100644
--- a/migration/mysql/atlas.sum
+++ b/migration/mysql/atlas.sum
@@ -1,4 +1,4 @@
-h1:ByERmIG4qrnBTy9Iu6SJWvS0WrGAx+McScOzEnkb+GU=
+h1:VXTmzqYh41HnDCRZyYb9OvaSQx2m1+GLavQcpqgGCjQ=
20240626022133_initialization.sql h1:u9qmPkwWX7PN92qEcDDfR92lrMpwadQSMxUJgv6LjQ0=
20240708065726_update_audit_log_table.sql h1:k7gK8Njv1yHMsYXAQtSgMaSbXy4lxyZ9MPzbJyMyyoM=
20240815043128_update_auto_ops_rule_table.sql h1:6ib+XfS1uu9AUO3qESvkpUfOu3qUsLwHm9KHcrGEz0E=
@@ -22,3 +22,5 @@ h1:ByERmIG4qrnBTy9Iu6SJWvS0WrGAx+McScOzEnkb+GU=
20250109061411_update_tag_table.sql h1:3QsxRDVjdv45SkOKTUFswaSFaXV2ViHoqjlr6XR5fmY=
20250115040347_update_account_v2_table.sql h1:nEzBj41mgpXbQGgbNaIZ9thMqvtfamLO9NHISpEwMm8=
20250116054703_remove_environment_namespace_column.sql h1:UNiN/syYAs8nUQOkMw3RRvDQBQU/kKYv7B3XBhL6qPM=
+20250116060049_update_goal_table.sql h1:zEhXMf2hntdk2Im9klR76vx6PEAh+cJwk3fKgm2gGPs=
+20250122261735_add_code_ref_table.sql h1:ZqE6Ekn3PnhBFdpuczJYo5KjwTvcgeqSnkuLCNeHoCA=
diff --git a/pkg/account/api/account.go b/pkg/account/api/account.go
index f4cf992465..6b608e0551 100644
--- a/pkg/account/api/account.go
+++ b/pkg/account/api/account.go
@@ -217,7 +217,7 @@ func (s *AccountService) createAccountV2NoCommand(
CreatedAt: account.CreatedAt,
UpdatedAt: account.UpdatedAt,
},
- storage.AdminEnvironmentNamespace,
+ storage.AdminEnvironmentID,
account,
nil,
)
@@ -310,7 +310,7 @@ func (s *AccountService) changeExistedAccountV2EnvironmentRoles(
Email: updated.Email,
EnvironmentRoles: updated.EnvironmentRoles,
},
- storage.AdminEnvironmentNamespace,
+ storage.AdminEnvironmentID,
updated,
account,
)
diff --git a/pkg/api/api/api_grpc.go b/pkg/api/api/api_grpc.go
index 005fea68a0..3ce2c61892 100644
--- a/pkg/api/api/api_grpc.go
+++ b/pkg/api/api/api_grpc.go
@@ -32,6 +32,7 @@ import (
accountclient "github.com/bucketeer-io/bucketeer/pkg/account/client"
"github.com/bucketeer-io/bucketeer/pkg/cache"
cachev3 "github.com/bucketeer-io/bucketeer/pkg/cache/v3"
+ coderefclient "github.com/bucketeer-io/bucketeer/pkg/coderef/client"
featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client"
featuredomain "github.com/bucketeer-io/bucketeer/pkg/feature/domain"
"github.com/bucketeer-io/bucketeer/pkg/log"
@@ -142,6 +143,7 @@ type grpcGatewayService struct {
featureClient featureclient.Client
accountClient accountclient.Client
pushClient pushclient.Client
+ codeRefClient coderefclient.Client
goalPublisher publisher.Publisher
evaluationPublisher publisher.Publisher
userPublisher publisher.Publisher
@@ -157,6 +159,7 @@ func NewGrpcGatewayService(
featureClient featureclient.Client,
accountClient accountclient.Client,
pushClient pushclient.Client,
+ codeRefClient coderefclient.Client,
gp publisher.Publisher,
ep publisher.Publisher,
up publisher.Publisher,
@@ -174,6 +177,7 @@ func NewGrpcGatewayService(
featureClient: featureClient,
accountClient: accountClient,
pushClient: pushClient,
+ codeRefClient: codeRefClient,
goalPublisher: gp,
evaluationPublisher: ep,
userPublisher: up,
diff --git a/pkg/api/api/api_grpc_test.go b/pkg/api/api/api_grpc_test.go
index 7e8b8216c1..16479f85be 100644
--- a/pkg/api/api/api_grpc_test.go
+++ b/pkg/api/api/api_grpc_test.go
@@ -37,6 +37,7 @@ import (
accountclientmock "github.com/bucketeer-io/bucketeer/pkg/account/client/mock"
"github.com/bucketeer-io/bucketeer/pkg/cache"
cachev3mock "github.com/bucketeer-io/bucketeer/pkg/cache/v3/mock"
+ coderefclientmock "github.com/bucketeer-io/bucketeer/pkg/coderef/client/mock"
featureclientmock "github.com/bucketeer-io/bucketeer/pkg/feature/client/mock"
"github.com/bucketeer-io/bucketeer/pkg/log"
"github.com/bucketeer-io/bucketeer/pkg/metrics"
@@ -93,7 +94,7 @@ func TestWithLogger(t *testing.T) {
func TestNewGrpcGatewayService(t *testing.T) {
t.Parallel()
- g := NewGrpcGatewayService(nil, nil, nil, nil, nil, nil, nil)
+ g := NewGrpcGatewayService(nil, nil, nil, nil, nil, nil, nil, nil)
assert.IsType(t, &grpcGatewayService{}, g)
}
@@ -3959,6 +3960,7 @@ func newGrpcGatewayServiceWithMock(t *testing.T, mockController *gomock.Controll
featureClient: featureclientmock.NewMockClient(mockController),
accountClient: accountclientmock.NewMockClient(mockController),
pushClient: pushclientmock.NewMockClient(mockController),
+ codeRefClient: coderefclientmock.NewMockClient(mockController),
goalPublisher: publishermock.NewMockPublisher(mockController),
userPublisher: publishermock.NewMockPublisher(mockController),
evaluationPublisher: publishermock.NewMockPublisher(mockController),
diff --git a/pkg/api/api/code_reference.go b/pkg/api/api/code_reference.go
new file mode 100644
index 0000000000..dcecf3ce40
--- /dev/null
+++ b/pkg/api/api/code_reference.go
@@ -0,0 +1,267 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "context"
+
+ "go.uber.org/zap"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/status"
+
+ "github.com/bucketeer-io/bucketeer/pkg/log"
+ "github.com/bucketeer-io/bucketeer/pkg/role"
+ accountproto "github.com/bucketeer-io/bucketeer/proto/account"
+ coderefproto "github.com/bucketeer-io/bucketeer/proto/coderef"
+ gatewayproto "github.com/bucketeer-io/bucketeer/proto/gateway"
+)
+
+func (s *grpcGatewayService) GetCodeReference(
+ ctx context.Context,
+ req *gatewayproto.GetCodeReferenceRequest,
+) (*gatewayproto.GetCodeReferenceResponse, error) {
+ envAPIKey, err := s.checkRequest(ctx, []accountproto.APIKey_Role{
+ accountproto.APIKey_PUBLIC_API_READ_ONLY,
+ accountproto.APIKey_PUBLIC_API_WRITE,
+ accountproto.APIKey_PUBLIC_API_ADMIN,
+ })
+ if err != nil {
+ s.logger.Error("Failed to check GetCodeReference request",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ return nil, err
+ }
+ resp, err := s.codeRefClient.GetCodeReference(ctx, &coderefproto.GetCodeReferenceRequest{
+ Id: req.Id,
+ EnvironmentId: envAPIKey.Environment.Id,
+ })
+ if err != nil {
+ if status.Code(err) == codes.NotFound {
+ s.logger.Info(
+ "Code reference not found",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.NotFound, "not found")
+ }
+ s.logger.Error(
+ "Failed to get code reference",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.Internal, "internal error")
+ }
+ return &gatewayproto.GetCodeReferenceResponse{
+ CodeReference: resp.CodeReference,
+ }, nil
+}
+
+func (s *grpcGatewayService) ListCodeReferences(
+ ctx context.Context,
+ req *gatewayproto.ListCodeReferencesRequest,
+) (*gatewayproto.ListCodeReferencesResponse, error) {
+ envAPIKey, err := s.checkRequest(ctx, []accountproto.APIKey_Role{
+ accountproto.APIKey_PUBLIC_API_READ_ONLY,
+ accountproto.APIKey_PUBLIC_API_WRITE,
+ accountproto.APIKey_PUBLIC_API_ADMIN,
+ })
+ if err != nil {
+ s.logger.Error("Failed to check ListCodeReferences request",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ return nil, err
+ }
+ resp, err := s.codeRefClient.ListCodeReferences(ctx, &coderefproto.ListCodeReferencesRequest{
+ PageSize: req.PageSize,
+ Cursor: req.Cursor,
+ OrderBy: coderefproto.ListCodeReferencesRequest_OrderBy(req.OrderBy),
+ OrderDirection: coderefproto.ListCodeReferencesRequest_OrderDirection(req.OrderDirection),
+ FeatureId: req.FeatureId,
+ EnvironmentId: envAPIKey.Environment.Id,
+ })
+ if err != nil {
+ s.logger.Error(
+ "Failed to list code references",
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.Internal, "internal error")
+ }
+ return &gatewayproto.ListCodeReferencesResponse{
+ CodeReferences: resp.CodeReferences,
+ Cursor: resp.Cursor,
+ TotalCount: resp.TotalCount,
+ }, nil
+}
+
+func (s *grpcGatewayService) CreateCodeReference(
+ ctx context.Context,
+ req *gatewayproto.CreateCodeReferenceRequest,
+) (*gatewayproto.CreateCodeReferenceResponse, error) {
+ envAPIKey, err := s.checkRequest(ctx, []accountproto.APIKey_Role{
+ accountproto.APIKey_PUBLIC_API_WRITE,
+ accountproto.APIKey_PUBLIC_API_ADMIN,
+ })
+ if err != nil {
+ s.logger.Error("Failed to check CreateCodeReference request",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ return nil, err
+ }
+
+ headerMetaData := metadata.New(map[string]string{
+ role.APIKeyTokenMDKey: envAPIKey.ApiKey.ApiKey,
+ role.APIKeyMaintainerMDKey: envAPIKey.ApiKey.Maintainer,
+ role.APIKeyNameMDKey: envAPIKey.ApiKey.Name,
+ })
+ ctx = metadata.NewOutgoingContext(ctx, headerMetaData)
+
+ resp, err := s.codeRefClient.CreateCodeReference(ctx, &coderefproto.CreateCodeReferenceRequest{
+ FeatureId: req.FeatureId,
+ EnvironmentId: envAPIKey.Environment.Id,
+ FilePath: req.FilePath,
+ LineNumber: req.LineNumber,
+ CodeSnippet: req.CodeSnippet,
+ ContentHash: req.ContentHash,
+ Aliases: req.Aliases,
+ RepositoryName: req.RepositoryName,
+ RepositoryOwner: req.RepositoryOwner,
+ RepositoryType: req.RepositoryType,
+ RepositoryBranch: req.RepositoryBranch,
+ CommitHash: req.CommitHash,
+ })
+ if err != nil {
+ s.logger.Error(
+ "Failed to create code reference",
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.Internal, "internal error")
+ }
+ return &gatewayproto.CreateCodeReferenceResponse{
+ CodeReference: resp.CodeReference,
+ }, nil
+}
+
+func (s *grpcGatewayService) UpdateCodeReference(
+ ctx context.Context,
+ req *gatewayproto.UpdateCodeReferenceRequest,
+) (*gatewayproto.UpdateCodeReferenceResponse, error) {
+ envAPIKey, err := s.checkRequest(ctx, []accountproto.APIKey_Role{
+ accountproto.APIKey_PUBLIC_API_WRITE,
+ accountproto.APIKey_PUBLIC_API_ADMIN,
+ })
+ if err != nil {
+ s.logger.Error("Failed to check UpdateCodeReference request",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ return nil, err
+ }
+
+ headerMetaData := metadata.New(map[string]string{
+ role.APIKeyTokenMDKey: envAPIKey.ApiKey.ApiKey,
+ role.APIKeyMaintainerMDKey: envAPIKey.ApiKey.Maintainer,
+ role.APIKeyNameMDKey: envAPIKey.ApiKey.Name,
+ })
+ ctx = metadata.NewOutgoingContext(ctx, headerMetaData)
+
+ resp, err := s.codeRefClient.UpdateCodeReference(ctx, &coderefproto.UpdateCodeReferenceRequest{
+ Id: req.Id,
+ EnvironmentId: envAPIKey.Environment.Id,
+ FilePath: req.FilePath,
+ LineNumber: req.LineNumber,
+ CodeSnippet: req.CodeSnippet,
+ ContentHash: req.ContentHash,
+ Aliases: req.Aliases,
+ RepositoryBranch: req.RepositoryBranch,
+ CommitHash: req.CommitHash,
+ })
+ if err != nil {
+ if status.Code(err) == codes.NotFound {
+ s.logger.Info(
+ "Code reference not found",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.NotFound, "not found")
+ }
+ s.logger.Error(
+ "Failed to update code reference",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.Internal, "internal error")
+ }
+ return &gatewayproto.UpdateCodeReferenceResponse{
+ CodeReference: resp.CodeReference,
+ }, nil
+}
+
+func (s *grpcGatewayService) DeleteCodeReference(
+ ctx context.Context,
+ req *gatewayproto.DeleteCodeReferenceRequest,
+) (*gatewayproto.DeleteCodeReferenceResponse, error) {
+ envAPIKey, err := s.checkRequest(ctx, []accountproto.APIKey_Role{
+ accountproto.APIKey_PUBLIC_API_WRITE,
+ accountproto.APIKey_PUBLIC_API_ADMIN,
+ })
+ if err != nil {
+ s.logger.Error("Failed to check DeleteCodeReference request",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ return nil, err
+ }
+
+ headerMetaData := metadata.New(map[string]string{
+ role.APIKeyTokenMDKey: envAPIKey.ApiKey.ApiKey,
+ role.APIKeyMaintainerMDKey: envAPIKey.ApiKey.Maintainer,
+ role.APIKeyNameMDKey: envAPIKey.ApiKey.Name,
+ })
+ ctx = metadata.NewOutgoingContext(ctx, headerMetaData)
+
+ _, err = s.codeRefClient.DeleteCodeReference(ctx, &coderefproto.DeleteCodeReferenceRequest{
+ Id: req.Id,
+ EnvironmentId: envAPIKey.Environment.Id,
+ })
+ if err != nil {
+ if status.Code(err) == codes.NotFound {
+ s.logger.Info(
+ "Code reference not found",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.NotFound, "not found")
+ }
+ s.logger.Error(
+ "Failed to delete code reference",
+ zap.String("id", req.Id),
+ zap.Error(err),
+ )
+ return nil, status.Error(codes.Internal, "internal error")
+ }
+ return &gatewayproto.DeleteCodeReferenceResponse{}, nil
+}
diff --git a/pkg/api/api/metrics.go b/pkg/api/api/metrics.go
index 8748c1d336..e1dc0c6674 100644
--- a/pkg/api/api/metrics.go
+++ b/pkg/api/api/metrics.go
@@ -92,7 +92,7 @@ var (
// TODO: Remove project_id.
}, []string{
"project_id", "project_url_code",
- "environment_namespace", "environment_url_code", "tag", "evaluation_type",
+ "environment_id", "environment_url_code", "tag", "evaluation_type",
})
getFeatureFlagsCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
@@ -103,7 +103,7 @@ var (
// TODO: Remove project_id.
}, []string{
"project_id", "project_url_code",
- "environment_namespace", "environment_url_code", "tag", "response_type",
+ "environment_id", "environment_url_code", "tag", "response_type",
})
getSegmentUsersCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
@@ -113,7 +113,7 @@ var (
Help: "Total number of get segment users api requests",
// TODO: Remove project_id.
}, []string{
- "project_id", "project_url_code", "environment_namespace", "environment_url_code",
+ "project_id", "project_url_code", "environment_id", "environment_url_code",
"source_id", "sdk_version", "response_type",
})
requestTotal = prometheus.NewCounterVec(
@@ -151,7 +151,7 @@ var (
Name: "sdk_get_evaluations_handling_seconds",
Help: "Histogram of get evaluations response latency (seconds).",
Buckets: prometheus.DefBuckets,
- }, []string{"environment_namespace", "tag", "state"})
+ }, []string{"environment_id", "tag", "state"})
// TODO: Remove after deleting api-gateway REST server
sdkGetEvaluationsSizeHistogram = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
@@ -160,7 +160,7 @@ var (
Name: "sdk_get_evaluations_size",
Help: "Histogram of get evaluations response size (byte).",
Buckets: prometheus.DefBuckets,
- }, []string{"environment_namespace", "tag", "state"})
+ }, []string{"environment_id", "tag", "state"})
// TODO: Remove after deleting api-gateway REST server
sdkTimeoutErrorCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
@@ -168,7 +168,7 @@ var (
Subsystem: "metrics_event",
Name: "sdk_timeout_error_total",
Help: "Total number of sdk timeout errors",
- }, []string{"environment_namespace", "tag"})
+ }, []string{"environment_id", "tag"})
// TODO: Remove after deleting api-gateway REST server
sdkInternalErrorCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
@@ -176,7 +176,7 @@ var (
Subsystem: "metrics_event",
Name: "sdk_internal_error_total",
Help: "Total number of sdk internal errors",
- }, []string{"environment_namespace", "tag"})
+ }, []string{"environment_id", "tag"})
sdkLatencyHistogram = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: "bucketeer",
@@ -184,7 +184,7 @@ var (
Name: "sdk_api_handling_seconds",
Help: "Histogram of get evaluations response latency (seconds).",
Buckets: prometheus.DefBuckets,
- }, []string{"project_id", "environment_namespace", "tag", "api", "sdk_version", "source_id"})
+ }, []string{"project_id", "environment_id", "tag", "api", "sdk_version", "source_id"})
sdkSizeHistogram = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: "bucketeer",
@@ -192,14 +192,14 @@ var (
Name: "sdk_api_response_size",
Help: "Histogram of get evaluations response size (byte).",
Buckets: prometheus.DefBuckets,
- }, []string{"project_id", "environment_namespace", "tag", "api", "sdk_version", "source_id"})
+ }, []string{"project_id", "environment_id", "tag", "api", "sdk_version", "source_id"})
sdkErrorCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "bucketeer",
Subsystem: "metrics_event",
Name: "sdk_api_error_total",
Help: "Total number of sdk errors",
- }, []string{"project_id", "environment_namespace", "tag", "error_type", "api", "sdk_version", "source_id"})
+ }, []string{"project_id", "environment_id", "tag", "error_type", "api", "sdk_version", "source_id"})
)
func registerMetrics(r metrics.Registerer) {
diff --git a/pkg/api/api/push.go b/pkg/api/api/push.go
index 58e7d0c1ef..d40cf5f1ec 100644
--- a/pkg/api/api/push.go
+++ b/pkg/api/api/push.go
@@ -61,7 +61,7 @@ func (s *grpcGatewayService) ListPushes(
if res == nil {
s.logger.Error("Failed to list pushes: nil response",
log.FieldsFromImcomingContext(ctx).AddFields(
- zap.String("environment_namespace", envAPIKey.Environment.Id),
+ zap.String("environment_id", envAPIKey.Environment.Id),
zap.String("search_keyword", req.SearchKeyword),
)...,
)
diff --git a/pkg/api/cmd/server.go b/pkg/api/cmd/server.go
index fc6542f3db..c8dbff2117 100644
--- a/pkg/api/cmd/server.go
+++ b/pkg/api/cmd/server.go
@@ -25,6 +25,7 @@ import (
"github.com/bucketeer-io/bucketeer/pkg/api/api"
cachev3 "github.com/bucketeer-io/bucketeer/pkg/cache/v3"
"github.com/bucketeer-io/bucketeer/pkg/cli"
+ coderefclient "github.com/bucketeer-io/bucketeer/pkg/coderef/client"
featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client"
"github.com/bucketeer-io/bucketeer/pkg/health"
"github.com/bucketeer-io/bucketeer/pkg/metrics"
@@ -53,6 +54,7 @@ type server struct {
publishTimeout *time.Duration
featureService *string
accountService *string
+ codeRefService *string
pushService *string
redisServerName *string
redisAddr *string
@@ -107,6 +109,10 @@ func RegisterCommand(r cli.CommandRegistry, p cli.ParentCommand) cli.Command {
"push-service",
"bucketeer-push-service address.",
).Default("push:9090").String(),
+ codeRefService: cmd.Flag(
+ "code-ref-service",
+ "bucketeer-code-ref-service address.",
+ ).Default("code-ref:9090").String(),
redisServerName: cmd.Flag("redis-server-name", "Name of the redis.").Required().String(),
redisAddr: cmd.Flag("redis-addr", "Address of the redis.").Required().String(),
certPath: cmd.Flag("cert", "Path to TLS certificate.").Required().String(),
@@ -242,6 +248,18 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
}
defer pushClient.Close()
+ codeRefClient, err := coderefclient.NewClient(*s.codeRefService, *s.certPath,
+ client.WithPerRPCCredentials(creds),
+ client.WithDialTimeout(30*time.Second),
+ client.WithBlock(),
+ client.WithMetrics(registerer),
+ client.WithLogger(logger),
+ )
+ if err != nil {
+ return err
+ }
+ defer codeRefClient.Close()
+
redisV3Client, err := redisv3.NewClient(
*s.redisAddr,
redisv3.WithPoolSize(*s.redisPoolMaxActive),
@@ -260,6 +278,7 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
featureClient,
accountClient,
pushClient,
+ codeRefClient,
goalPublisher,
evaluationPublisher,
userPublisher,
diff --git a/pkg/autoops/api/api.go b/pkg/autoops/api/api.go
index 2bb5772b3a..480fcc1d9d 100644
--- a/pkg/autoops/api/api.go
+++ b/pkg/autoops/api/api.go
@@ -182,25 +182,9 @@ func (s *AutoOpsService) CreateAutoOpsRule(
return nil, dt.Err()
}
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(tx)
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, _ mysql.Transaction) error {
+ autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(s.mysqlClient)
handler, err := command.NewAutoOpsCommandHandler(editor, autoOpsRule, s.publisher, req.EnvironmentId)
if err != nil {
return err
@@ -208,7 +192,7 @@ func (s *AutoOpsService) CreateAutoOpsRule(
if err := handler.Handle(ctx, req.Command); err != nil {
return err
}
- return autoOpsRuleStorage.CreateAutoOpsRule(ctx, autoOpsRule, req.EnvironmentId)
+ return autoOpsRuleStorage.CreateAutoOpsRule(contextWithTx, autoOpsRule, req.EnvironmentId)
})
if err != nil {
if err == v2as.ErrAutoOpsRuleAlreadyExists {
@@ -473,27 +457,10 @@ func (s *AutoOpsService) StopAutoOpsRule(
if err := validateStopAutoOpsRuleRequest(req, localizer); err != nil {
return nil, err
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(tx)
- autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(ctx, req.Id, req.EnvironmentId)
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, _ mysql.Transaction) error {
+ autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(s.mysqlClient)
+ autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(contextWithTx, req.Id, req.EnvironmentId)
if err != nil {
return err
}
@@ -514,7 +481,7 @@ func (s *AutoOpsService) StopAutoOpsRule(
if err := handler.Handle(ctx, req.Command); err != nil {
return err
}
- return autoOpsRuleStorage.UpdateAutoOpsRule(ctx, autoOpsRule, req.EnvironmentId)
+ return autoOpsRuleStorage.UpdateAutoOpsRule(contextWithTx, autoOpsRule, req.EnvironmentId)
})
if err != nil {
@@ -561,26 +528,10 @@ func (s *AutoOpsService) DeleteAutoOpsRule(
if err := validateDeleteAutoOpsRuleRequest(req, localizer); err != nil {
return nil, err
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(tx)
- autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(ctx, req.Id, req.EnvironmentId)
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, _ mysql.Transaction) error {
+ autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(s.mysqlClient)
+ autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(contextWithTx, req.Id, req.EnvironmentId)
if err != nil {
return err
}
@@ -591,7 +542,7 @@ func (s *AutoOpsService) DeleteAutoOpsRule(
if err := handler.Handle(ctx, req.Command); err != nil {
return err
}
- return autoOpsRuleStorage.UpdateAutoOpsRule(ctx, autoOpsRule, req.EnvironmentId)
+ return autoOpsRuleStorage.UpdateAutoOpsRule(contextWithTx, autoOpsRule, req.EnvironmentId)
})
if err != nil {
if err == v2as.ErrAutoOpsRuleNotFound || err == v2as.ErrAutoOpsRuleUnexpectedAffectedRows {
@@ -696,26 +647,10 @@ func (s *AutoOpsService) UpdateAutoOpsRule(
}
}
commands := s.createUpdateAutoOpsRuleCommands(req)
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(tx)
- autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(ctx, req.Id, req.EnvironmentId)
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, _ mysql.Transaction) error {
+ autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(s.mysqlClient)
+ autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(contextWithTx, req.Id, req.EnvironmentId)
if err != nil {
return err
}
@@ -817,7 +752,7 @@ func (s *AutoOpsService) UpdateAutoOpsRule(
return err
}
}
- return autoOpsRuleStorage.UpdateAutoOpsRule(ctx, autoOpsRule, req.EnvironmentId)
+ return autoOpsRuleStorage.UpdateAutoOpsRule(contextWithTx, autoOpsRule, req.EnvironmentId)
})
if err != nil {
if err == v2as.ErrAutoOpsRuleNotFound || err == v2as.ErrAutoOpsRuleUnexpectedAffectedRows {
@@ -1187,26 +1122,10 @@ func (s *AutoOpsService) ExecuteAutoOps(
if triggered {
return &autoopsproto.ExecuteAutoOpsResponse{AlreadyTriggered: true}, nil
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(tx)
- autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(ctx, req.Id, req.EnvironmentId)
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
+ autoOpsRuleStorage := v2as.NewAutoOpsRuleStorage(s.mysqlClient)
+ autoOpsRule, err := autoOpsRuleStorage.GetAutoOpsRule(contextWithTx, req.Id, req.EnvironmentId)
if err != nil {
return err
}
@@ -1231,15 +1150,15 @@ func (s *AutoOpsService) ExecuteAutoOps(
}
ftStorage := ftstorage.NewFeatureStorage(tx)
- feature, err := ftStorage.GetFeature(ctx, autoOpsRule.FeatureId, req.EnvironmentId)
+ feature, err := ftStorage.GetFeature(contextWithTx, autoOpsRule.FeatureId, req.EnvironmentId)
if err != nil {
return err
}
- prStorage := v2as.NewProgressiveRolloutStorage(tx)
+ prStorage := v2as.NewProgressiveRolloutStorage(s.mysqlClient)
// Stop the running progressive rollout if the operation type is disable
if executeClause.ActionType == autoopsproto.ActionType_DISABLE {
if err := s.stopProgressiveRollout(
- ctx,
+ contextWithTx,
req.EnvironmentId,
autoOpsRule,
prStorage,
@@ -1249,7 +1168,7 @@ func (s *AutoOpsService) ExecuteAutoOps(
}
}
if err := executeAutoOpsRuleOperation(
- ctx,
+ contextWithTx,
ftStorage,
req.EnvironmentId,
executeClause.ActionType,
@@ -1280,7 +1199,7 @@ func (s *AutoOpsService) ExecuteAutoOps(
return err
}
- if err = autoOpsRuleStorage.UpdateAutoOpsRule(ctx, autoOpsRule, req.EnvironmentId); err != nil {
+ if err = autoOpsRuleStorage.UpdateAutoOpsRule(contextWithTx, autoOpsRule, req.EnvironmentId); err != nil {
if err == v2as.ErrAutoOpsRuleUnexpectedAffectedRows {
s.logger.Warn(
"No rows were affected",
diff --git a/pkg/autoops/api/api_test.go b/pkg/autoops/api/api_test.go
index 8c3865697c..826b79685d 100644
--- a/pkg/autoops/api/api_test.go
+++ b/pkg/autoops/api/api_test.go
@@ -367,9 +367,8 @@ func TestCreateAutoOpsRuleMySQL(t *testing.T) {
s.experimentClient.(*experimentclientmock.MockClient).EXPECT().GetGoal(
gomock.Any(), gomock.Any(),
).Return(&experimentproto.GetGoalResponse{}, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.CreateAutoOpsRuleRequest{
@@ -393,9 +392,8 @@ func TestCreateAutoOpsRuleMySQL(t *testing.T) {
{
desc: "success schedule",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.CreateAutoOpsRuleRequest{
@@ -590,9 +588,8 @@ func TestUpdateAutoOpsRuleMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.UpdateAutoOpsRuleRequest{
@@ -673,9 +670,8 @@ func TestStopAutoOpsRuleMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.StopAutoOpsRuleRequest{
@@ -738,9 +734,8 @@ func TestDeleteAutoOpsRuleMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.DeleteAutoOpsRuleRequest{
@@ -801,7 +796,11 @@ func TestGetAutoOpsRuleMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(mysql.ErrNoRows)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -821,7 +820,11 @@ func TestGetAutoOpsRuleMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -834,7 +837,11 @@ func TestGetAutoOpsRuleMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -888,7 +895,11 @@ func TestListAutoOpsRulesMySQL(t *testing.T) {
rows.EXPECT().Close().Return(nil)
rows.EXPECT().Next().Return(false)
rows.EXPECT().Err().Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(rows, nil)
},
@@ -910,7 +921,12 @@ func TestListAutoOpsRulesMySQL(t *testing.T) {
rows.EXPECT().Close().Return(nil)
rows.EXPECT().Next().Return(false)
rows.EXPECT().Err().Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(rows, nil)
},
@@ -1058,7 +1074,11 @@ func TestExecuteAutoOpsRuleMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(mysql.ErrNoRows)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -1076,12 +1096,15 @@ func TestExecuteAutoOpsRuleMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil).AnyTimes()
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.ExecuteAutoOpsRequest{
diff --git a/pkg/autoops/api/progressive_rollout.go b/pkg/autoops/api/progressive_rollout.go
index 1796c0f588..a2798ca445 100644
--- a/pkg/autoops/api/progressive_rollout.go
+++ b/pkg/autoops/api/progressive_rollout.go
@@ -57,24 +57,8 @@ func (s *AutoOpsService) CreateProgressiveRollout(
if err := s.validateCreateProgressiveRolloutRequest(ctx, req, localizer); err != nil {
return nil, err
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusProgressiveRolloutInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusProgressiveRolloutInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
progressiveRollout, err := domain.NewProgressiveRollout(
req.Command.FeatureId,
req.Command.ProgressiveRolloutManualScheduleClause,
@@ -83,7 +67,7 @@ func (s *AutoOpsService) CreateProgressiveRollout(
if err != nil {
return err
}
- storage := v2as.NewProgressiveRolloutStorage(tx)
+ storage := v2as.NewProgressiveRolloutStorage(s.mysqlClient)
handler, err := command.NewProgressiveRolloutCommandHandler(
editor,
progressiveRollout,
@@ -96,7 +80,7 @@ func (s *AutoOpsService) CreateProgressiveRollout(
if err := handler.Handle(ctx, req.Command); err != nil {
return err
}
- return storage.CreateProgressiveRollout(ctx, progressiveRollout, req.EnvironmentId)
+ return storage.CreateProgressiveRollout(contextWithTx, progressiveRollout, req.EnvironmentId)
})
if err != nil {
switch err {
@@ -213,26 +197,9 @@ func (s *AutoOpsService) updateProgressiveRollout(
editor *eventproto.Editor,
localizer locale.Localizer,
) error {
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusProgressiveRolloutInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return statusProgressiveRolloutInternal.Err()
- }
- return dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- storage := v2as.NewProgressiveRolloutStorage(tx)
- progressiveRollout, err := storage.GetProgressiveRollout(ctx, progressiveRolloutID, environmentId)
+ err := s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
+ storage := v2as.NewProgressiveRolloutStorage(s.mysqlClient)
+ progressiveRollout, err := storage.GetProgressiveRollout(contextWithTx, progressiveRolloutID, environmentId)
if err != nil {
return err
}
@@ -248,7 +215,7 @@ func (s *AutoOpsService) updateProgressiveRollout(
if err := handler.Handle(ctx, cmd); err != nil {
return err
}
- return storage.UpdateProgressiveRollout(ctx, progressiveRollout, environmentId)
+ return storage.UpdateProgressiveRollout(contextWithTx, progressiveRollout, environmentId)
})
if err != nil {
s.logger.Error(
@@ -295,26 +262,10 @@ func (s *AutoOpsService) DeleteProgressiveRollout(
if err := s.validateDeleteProgressiveRolloutRequest(req, localizer); err != nil {
return nil, err
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusProgressiveRolloutInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusProgressiveRolloutInternal.Err()
- }
- return nil, dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- storage := v2as.NewProgressiveRolloutStorage(tx)
- progressiveRollout, err := storage.GetProgressiveRollout(ctx, req.Id, req.EnvironmentId)
+
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
+ storage := v2as.NewProgressiveRolloutStorage(s.mysqlClient)
+ progressiveRollout, err := storage.GetProgressiveRollout(contextWithTx, req.Id, req.EnvironmentId)
if err != nil {
return err
}
@@ -330,7 +281,7 @@ func (s *AutoOpsService) DeleteProgressiveRollout(
if err := handler.Handle(ctx, req.Command); err != nil {
return err
}
- return storage.DeleteProgressiveRollout(ctx, req.Id, req.EnvironmentId)
+ return storage.DeleteProgressiveRollout(contextWithTx, req.Id, req.EnvironmentId)
})
if err != nil {
s.logger.Error(
@@ -402,26 +353,10 @@ func (s *AutoOpsService) ExecuteProgressiveRollout(
if err := s.validateExecuteProgressiveRolloutRequest(req, localizer); err != nil {
return nil, err
}
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusProgressiveRolloutInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return nil, statusProgressiveRolloutInternal.Err()
- }
- return nil, dt.Err()
- }
+
var event *eventproto.Event
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
- storage := v2as.NewProgressiveRolloutStorage(tx)
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
+ storage := v2as.NewProgressiveRolloutStorage(s.mysqlClient)
progressiveRollout, err := storage.GetProgressiveRollout(ctx, req.Id, req.EnvironmentId)
if err != nil {
return err
diff --git a/pkg/autoops/api/progressive_rollout_test.go b/pkg/autoops/api/progressive_rollout_test.go
index f2c715069a..df0fc3702e 100644
--- a/pkg/autoops/api/progressive_rollout_test.go
+++ b/pkg/autoops/api/progressive_rollout_test.go
@@ -643,41 +643,6 @@ func TestCreateProgressiveRolloutMySQL(t *testing.T) {
},
expectedErr: createError(statusProgressiveRolloutInvalidScheduleSpans, localizer.MustLocalize(locale.AutoOpsInvalidScheduleSpans)),
},
- {
- desc: "err: begin transaction error",
- setup: func(aos *AutoOpsService) {
- aos.featureClient.(*featureclientmock.MockClient).EXPECT().GetFeature(
- gomock.Any(), gomock.Any(),
- ).Return(&featureproto.GetFeatureResponse{Feature: &featureproto.Feature{
- Variations: []*featureproto.Variation{
- {
- Id: "vid-1",
- },
- {
- Id: "vid-2",
- },
- },
- Enabled: true,
- }}, nil)
- aos.experimentClient.(*experimentclientmock.MockClient).EXPECT().ListExperiments(gomock.Any(), gomock.Any()).Return(
- &experimentproto.ListExperimentsResponse{Experiments: []*experimentproto.Experiment{}},
- nil,
- )
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, errors.New("error"))
- },
- req: &autoopsproto.CreateProgressiveRolloutRequest{
- Command: &autoopsproto.CreateProgressiveRolloutCommand{
- FeatureId: "fid",
- ProgressiveRolloutTemplateScheduleClause: &autoopsproto.ProgressiveRolloutTemplateScheduleClause{
- VariationId: "vid-1",
- Schedules: validSchedules,
- Interval: autoopsproto.ProgressiveRolloutTemplateScheduleClause_DAILY,
- Increments: 2,
- },
- },
- },
- expectedErr: createError(statusProgressiveRolloutInternal, localizer.MustLocalize(locale.InternalServerError)),
- },
{
desc: "err: transaction error",
setup: func(aos *AutoOpsService) {
@@ -698,9 +663,8 @@ func TestCreateProgressiveRolloutMySQL(t *testing.T) {
&experimentproto.ListExperimentsResponse{Experiments: []*experimentproto.Experiment{}},
nil,
)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(errors.New("error"))
},
req: &autoopsproto.CreateProgressiveRolloutRequest{
@@ -736,9 +700,8 @@ func TestCreateProgressiveRolloutMySQL(t *testing.T) {
&experimentproto.ListExperimentsResponse{Experiments: []*experimentproto.Experiment{}},
nil,
)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2as.ErrProgressiveRolloutAlreadyExists)
},
req: &autoopsproto.CreateProgressiveRolloutRequest{
@@ -848,9 +811,8 @@ func TestCreateProgressiveRolloutMySQL(t *testing.T) {
&experimentproto.ListExperimentsResponse{Experiments: []*experimentproto.Experiment{}},
nil,
)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ aos.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.CreateProgressiveRolloutRequest{
@@ -914,7 +876,13 @@ func TestGetProgressiveRolloutMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(mysql.ErrNoRows)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -926,7 +894,13 @@ func TestGetProgressiveRolloutMySQL(t *testing.T) {
setup: func(s *AutoOpsService) {
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -981,26 +955,11 @@ func TestStopProgressiveRolloutMySQL(t *testing.T) {
req: &autoopsproto.StopProgressiveRolloutRequest{Id: "id", EnvironmentId: "ns"},
expectedErr: createError(statusProgressiveRolloutNoCommand, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "command")),
},
- {
- desc: "err: failed to begin transaction",
- setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, errors.New("error"))
- },
- req: &autoopsproto.StopProgressiveRolloutRequest{
- Id: "id",
- EnvironmentId: "ns",
- Command: &autoopsproto.StopProgressiveRolloutCommand{
- StoppedBy: autoopsproto.ProgressiveRollout_USER,
- },
- },
- expectedErr: createError(statusProgressiveRolloutInternal, localizer.MustLocalize(locale.InternalServerError)),
- },
{
desc: "err: internal error during transaction",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(errors.New("error"))
},
req: &autoopsproto.StopProgressiveRolloutRequest{
@@ -1015,9 +974,8 @@ func TestStopProgressiveRolloutMySQL(t *testing.T) {
{
desc: "err: not found",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2as.ErrProgressiveRolloutNotFound)
},
req: &autoopsproto.StopProgressiveRolloutRequest{
@@ -1032,9 +990,8 @@ func TestStopProgressiveRolloutMySQL(t *testing.T) {
{
desc: "err: unexpected affected rows",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2as.ErrProgressiveRolloutUnexpectedAffectedRows)
},
req: &autoopsproto.StopProgressiveRolloutRequest{
@@ -1049,9 +1006,8 @@ func TestStopProgressiveRolloutMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.StopProgressiveRolloutRequest{
@@ -1106,20 +1062,11 @@ func TestDeleteProgressiveRolloutMySQL(t *testing.T) {
req: &autoopsproto.DeleteProgressiveRolloutRequest{},
expectedErr: createError(statusProgressiveRolloutIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "id")),
},
- {
- desc: "err: failed to begin transaction",
- setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, errors.New("error"))
- },
- req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "wrongid", EnvironmentId: "ns0"},
- expectedErr: createError(statusProgressiveRolloutInternal, localizer.MustLocalize(locale.InternalServerError)),
- },
{
desc: "err: internal error during transaction",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(errors.New("error"))
},
req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "wrongid", EnvironmentId: "ns0"},
@@ -1128,9 +1075,8 @@ func TestDeleteProgressiveRolloutMySQL(t *testing.T) {
{
desc: "err: internal error during transaction",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(errors.New("error"))
},
req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "wrongid", EnvironmentId: "ns0"},
@@ -1139,9 +1085,8 @@ func TestDeleteProgressiveRolloutMySQL(t *testing.T) {
{
desc: "err: ErrProgressiveRolloutNotFound",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2as.ErrProgressiveRolloutNotFound)
},
req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "wrongid", EnvironmentId: "ns0"},
@@ -1150,9 +1095,8 @@ func TestDeleteProgressiveRolloutMySQL(t *testing.T) {
{
desc: "err: ErrProgressiveRolloutUnexpectedAffectedRows",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2as.ErrProgressiveRolloutUnexpectedAffectedRows)
},
req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "wrongid", EnvironmentId: "ns0"},
@@ -1161,9 +1105,8 @@ func TestDeleteProgressiveRolloutMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.DeleteProgressiveRolloutRequest{Id: "aid1", EnvironmentId: "ns0"},
@@ -1218,16 +1161,20 @@ func TestListProgressiveRolloutsMySQL(t *testing.T) {
{
desc: "err: interal error",
setup: func(s *AutoOpsService) {
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe).Times(2)
rows := mysqlmock.NewMockRows(mockController)
rows.EXPECT().Close().Return(nil)
rows.EXPECT().Next().Return(false)
rows.EXPECT().Err().Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryContext(
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(rows, nil)
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(errors.New("error"))
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -1238,16 +1185,20 @@ func TestListProgressiveRolloutsMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *AutoOpsService) {
+ qe := mysqlmock.NewMockQueryExecer(mockController)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe).Times(2)
rows := mysqlmock.NewMockRows(mockController)
rows.EXPECT().Close().Return(nil)
rows.EXPECT().Next().Return(false)
rows.EXPECT().Err().Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryContext(
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(rows, nil)
row := mysqlmock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -1317,26 +1268,11 @@ func TestExecuteProgressiveRolloutMySQL(t *testing.T) {
},
expectedErr: createError(statusProgressiveRolloutScheduleIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "schedule_id")),
},
- {
- desc: "err: begin transaction error",
- setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, errors.New("error"))
- },
- req: &autoopsproto.ExecuteProgressiveRolloutRequest{
- Id: "aid1",
- EnvironmentId: "ns0",
- ChangeProgressiveRolloutTriggeredAtCommand: &autoopsproto.ChangeProgressiveRolloutScheduleTriggeredAtCommand{
- ScheduleId: "sid1",
- },
- },
- expectedErr: createError(statusProgressiveRolloutInternal, localizer.MustLocalize(locale.InternalServerError)),
- },
{
desc: "success",
setup: func(s *AutoOpsService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &autoopsproto.ExecuteProgressiveRolloutRequest{
diff --git a/pkg/autoops/storage/v2/auto_ops_rule.go b/pkg/autoops/storage/v2/auto_ops_rule.go
index 69253908ac..7b1b72b9d1 100644
--- a/pkg/autoops/storage/v2/auto_ops_rule.go
+++ b/pkg/autoops/storage/v2/auto_ops_rule.go
@@ -56,11 +56,11 @@ type AutoOpsRuleStorage interface {
}
type autoOpsRuleStorage struct {
- qe mysql.QueryExecer
+ client mysql.Client
}
-func NewAutoOpsRuleStorage(qe mysql.QueryExecer) AutoOpsRuleStorage {
- return &autoOpsRuleStorage{qe: qe}
+func NewAutoOpsRuleStorage(client mysql.Client) AutoOpsRuleStorage {
+ return &autoOpsRuleStorage{client: client}
}
func (s *autoOpsRuleStorage) CreateAutoOpsRule(
@@ -68,7 +68,7 @@ func (s *autoOpsRuleStorage) CreateAutoOpsRule(
e *domain.AutoOpsRule,
environmentId string,
) error {
- _, err := s.qe.ExecContext(
+ _, err := s.client.Qe(ctx).ExecContext(
ctx,
insertAutoOpsRuleSQL,
e.Id,
@@ -95,7 +95,7 @@ func (s *autoOpsRuleStorage) UpdateAutoOpsRule(
e *domain.AutoOpsRule,
environmentId string,
) error {
- result, err := s.qe.ExecContext(
+ result, err := s.client.Qe(ctx).ExecContext(
ctx,
updateAutoOpsRuleSQL,
e.FeatureId,
@@ -127,7 +127,7 @@ func (s *autoOpsRuleStorage) GetAutoOpsRule(
) (*domain.AutoOpsRule, error) {
autoOpsRule := proto.AutoOpsRule{}
var opsType int32
- err := s.qe.QueryRowContext(
+ err := s.client.Qe(ctx).QueryRowContext(
ctx,
selectAutoOpsRuleSQL,
id,
@@ -162,7 +162,7 @@ func (s *autoOpsRuleStorage) ListAutoOpsRules(
orderBySQL := mysql.ConstructOrderBySQLString(orders)
limitOffsetSQL := mysql.ConstructLimitOffsetSQLString(limit, offset)
query := fmt.Sprintf(selectAutoOpsRulesSQL, whereSQL, orderBySQL, limitOffsetSQL)
- rows, err := s.qe.QueryContext(ctx, query, whereArgs...)
+ rows, err := s.client.Qe(ctx).QueryContext(ctx, query, whereArgs...)
if err != nil {
return nil, 0, err
}
diff --git a/pkg/autoops/storage/v2/auto_ops_rule_test.go b/pkg/autoops/storage/v2/auto_ops_rule_test.go
index 116e4a139d..7f7a819753 100644
--- a/pkg/autoops/storage/v2/auto_ops_rule_test.go
+++ b/pkg/autoops/storage/v2/auto_ops_rule_test.go
@@ -32,7 +32,8 @@ func TestNewAutoOpsRuleStorage(t *testing.T) {
t.Parallel()
mockController := gomock.NewController(t)
defer mockController.Finish()
- db := NewAutoOpsRuleStorage(mock.NewMockQueryExecer(mockController))
+ client := mock.NewMockClient(mockController)
+ db := NewAutoOpsRuleStorage(client)
assert.IsType(t, &autoOpsRuleStorage{}, db)
}
@@ -49,7 +50,11 @@ func TestCreateAutoOpsRule(t *testing.T) {
}{
{
setup: func(s *autoOpsRuleStorage) {
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(nil, mysql.ErrDuplicateEntry)
},
@@ -61,7 +66,11 @@ func TestCreateAutoOpsRule(t *testing.T) {
},
{
setup: func(s *autoOpsRuleStorage) {
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(nil, nil)
},
@@ -97,7 +106,11 @@ func TestUpdateAutoOpsRule(t *testing.T) {
setup: func(s *autoOpsRuleStorage) {
result := mock.NewMockResult(mockController)
result.EXPECT().RowsAffected().Return(int64(0), nil)
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(result, nil)
},
@@ -111,7 +124,11 @@ func TestUpdateAutoOpsRule(t *testing.T) {
setup: func(s *autoOpsRuleStorage) {
result := mock.NewMockResult(mockController)
result.EXPECT().RowsAffected().Return(int64(1), nil)
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(result, nil)
},
@@ -148,7 +165,11 @@ func TestGetAutoOpsRule(t *testing.T) {
setup: func(s *autoOpsRuleStorage) {
row := mock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(mysql.ErrNoRows)
- s.qe.(*mock.MockQueryExecer).EXPECT().QueryRowContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -161,7 +182,11 @@ func TestGetAutoOpsRule(t *testing.T) {
setup: func(s *autoOpsRuleStorage) {
row := mock.NewMockRow(mockController)
row.EXPECT().Scan(gomock.Any()).Return(nil)
- s.qe.(*mock.MockQueryExecer).EXPECT().QueryRowContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
},
@@ -199,7 +224,11 @@ func TestListAutoOpsRules(t *testing.T) {
}{
{
setup: func(s *autoOpsRuleStorage) {
- s.qe.(*mock.MockQueryExecer).EXPECT().QueryContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(nil, errors.New("error"))
},
@@ -217,7 +246,11 @@ func TestListAutoOpsRules(t *testing.T) {
rows.EXPECT().Close().Return(nil)
rows.EXPECT().Next().Return(false)
rows.EXPECT().Err().Return(nil)
- s.qe.(*mock.MockQueryExecer).EXPECT().QueryContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+ qe.EXPECT().QueryContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(rows, nil)
},
@@ -254,5 +287,5 @@ func TestListAutoOpsRules(t *testing.T) {
func newAutoOpsRuleStorageWithMock(t *testing.T, mockController *gomock.Controller) *autoOpsRuleStorage {
t.Helper()
- return &autoOpsRuleStorage{mock.NewMockQueryExecer(mockController)}
+ return &autoOpsRuleStorage{mock.NewMockClient(mockController)}
}
diff --git a/pkg/autoops/storage/v2/progressive_rollout.go b/pkg/autoops/storage/v2/progressive_rollout.go
index 4a0b3c9864..586325f4e4 100644
--- a/pkg/autoops/storage/v2/progressive_rollout.go
+++ b/pkg/autoops/storage/v2/progressive_rollout.go
@@ -48,7 +48,7 @@ var (
)
type progressiveRolloutStorage struct {
- qe mysql.QueryExecer
+ client mysql.Client
}
type ProgressiveRolloutStorage interface {
@@ -71,8 +71,8 @@ type ProgressiveRolloutStorage interface {
) error
}
-func NewProgressiveRolloutStorage(qe mysql.QueryExecer) ProgressiveRolloutStorage {
- return &progressiveRolloutStorage{qe: qe}
+func NewProgressiveRolloutStorage(client mysql.Client) ProgressiveRolloutStorage {
+ return &progressiveRolloutStorage{client: client}
}
func (s *progressiveRolloutStorage) CreateProgressiveRollout(
@@ -80,7 +80,7 @@ func (s *progressiveRolloutStorage) CreateProgressiveRollout(
progressiveRollout *domain.ProgressiveRollout,
environmentId string,
) error {
- _, err := s.qe.ExecContext(
+ _, err := s.client.Qe(ctx).ExecContext(
ctx,
insertOpsProgressiveRolloutSQL,
progressiveRollout.Id,
@@ -108,7 +108,7 @@ func (s *progressiveRolloutStorage) GetProgressiveRollout(
id, environmentId string,
) (*domain.ProgressiveRollout, error) {
progressiveRollout := autoopsproto.ProgressiveRollout{}
- err := s.qe.QueryRowContext(
+ err := s.client.Qe(ctx).QueryRowContext(
ctx,
selectOpsProgressiveRolloutSQL,
id,
@@ -137,7 +137,7 @@ func (s *progressiveRolloutStorage) DeleteProgressiveRollout(
ctx context.Context,
id, environmentId string,
) error {
- result, err := s.qe.ExecContext(
+ result, err := s.client.Qe(ctx).ExecContext(
ctx,
deleteOpsProgressiveRolloutSQL,
id,
@@ -166,7 +166,7 @@ func (s *progressiveRolloutStorage) ListProgressiveRollouts(
orderBySQL := mysql.ConstructOrderBySQLString(orders)
limitOffsetSQL := mysql.ConstructLimitOffsetSQLString(limit, offset)
query := fmt.Sprintf(selectOpsProgressiveRolloutsSQL, whereSQL, orderBySQL, limitOffsetSQL)
- rows, err := s.qe.QueryContext(ctx, query, whereArgs...)
+ rows, err := s.client.Qe(ctx).QueryContext(ctx, query, whereArgs...)
if err != nil {
return nil, 0, 0, err
}
@@ -196,7 +196,7 @@ func (s *progressiveRolloutStorage) ListProgressiveRollouts(
nextOffset := offset + len(progressiveRollouts)
var totalCount int64
countQuery := fmt.Sprintf(countOpsProgressiveRolloutsSQL, whereSQL)
- err = s.qe.QueryRowContext(ctx, countQuery, whereArgs...).Scan(&totalCount)
+ err = s.client.Qe(ctx).QueryRowContext(ctx, countQuery, whereArgs...).Scan(&totalCount)
if err != nil {
return nil, 0, 0, err
}
@@ -208,7 +208,7 @@ func (s *progressiveRolloutStorage) UpdateProgressiveRollout(
progressiveRollout *domain.ProgressiveRollout,
environmentId string,
) error {
- result, err := s.qe.ExecContext(
+ result, err := s.client.Qe(ctx).ExecContext(
ctx,
updateOpsProgressiveRolloutSQL,
&progressiveRollout.FeatureId,
diff --git a/pkg/autoops/storage/v2/progressive_rollout_test.go b/pkg/autoops/storage/v2/progressive_rollout_test.go
index 976e17df06..797f31dd6d 100644
--- a/pkg/autoops/storage/v2/progressive_rollout_test.go
+++ b/pkg/autoops/storage/v2/progressive_rollout_test.go
@@ -31,7 +31,7 @@ func TestNewProgressiveRolloutStorage(t *testing.T) {
t.Parallel()
mockController := gomock.NewController(t)
defer mockController.Finish()
- db := NewProgressiveRolloutStorage(mock.NewMockQueryExecer(mockController))
+ db := NewProgressiveRolloutStorage(mock.NewMockClient(mockController))
assert.IsType(t, &progressiveRolloutStorage{}, db)
}
@@ -48,9 +48,14 @@ func TestCreateProgressiveRollout(t *testing.T) {
expectedErr error
}{
{
- desc: "",
+ desc: "error",
setup: func(s *progressiveRolloutStorage) {
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(nil, mysql.ErrDuplicateEntry)
},
@@ -61,8 +66,14 @@ func TestCreateProgressiveRollout(t *testing.T) {
expectedErr: ErrProgressiveRolloutAlreadyExists,
},
{
+ desc: "success",
setup: func(s *progressiveRolloutStorage) {
- s.qe.(*mock.MockQueryExecer).EXPECT().ExecContext(
+ qe := mock.NewMockQueryExecer(mockController)
+ s.client.(*mock.MockClient).EXPECT().Qe(
+ gomock.Any(),
+ ).Return(qe)
+
+ qe.EXPECT().ExecContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(nil, nil)
},
@@ -85,5 +96,5 @@ func TestCreateProgressiveRollout(t *testing.T) {
func newProgressiveRolloutStorageWithMock(t *testing.T, mockController *gomock.Controller) *progressiveRolloutStorage {
t.Helper()
- return &progressiveRolloutStorage{mock.NewMockQueryExecer(mockController)}
+ return &progressiveRolloutStorage{mock.NewMockClient(mockController)}
}
diff --git a/pkg/batch/api/api.go b/pkg/batch/api/api.go
index 657c8f7218..08fe8312df 100644
--- a/pkg/batch/api/api.go
+++ b/pkg/batch/api/api.go
@@ -49,6 +49,7 @@ type batchService struct {
apiKeyCacher jobs.Job
experimentCacher jobs.Job
autoOpsRulesCacher jobs.Job
+ tagDeleter jobs.Job
logger *zap.Logger
}
@@ -59,7 +60,7 @@ func NewBatchService(
redisCounterDeleter, experimentCalculator,
mauSummarizer, mauPartitionDeleter, mauPartitionCreator,
featureFlagCacher, segmentUserCacher, apiKeyCacher,
- experimentCacher, autoOpsRulesCacher jobs.Job,
+ experimentCacher, autoOpsRulesCacher, tagDeleter jobs.Job,
logger *zap.Logger,
) *batchService {
return &batchService{
@@ -80,6 +81,7 @@ func NewBatchService(
apiKeyCacher: apiKeyCacher,
experimentCacher: experimentCacher,
autoOpsRulesCacher: autoOpsRulesCacher,
+ tagDeleter: tagDeleter,
logger: logger.Named("batch-service"),
}
}
@@ -122,6 +124,8 @@ func (s *batchService) ExecuteBatchJob(
err = s.experimentCacher.Run(ctx)
case batch.BatchJob_AutoOpsRulesCacher:
err = s.autoOpsRulesCacher.Run(ctx)
+ case batch.BatchJob_TagDeleter:
+ err = s.tagDeleter.Run(ctx)
default:
s.logger.Error("Unknown job",
log.FieldsFromImcomingContext(ctx).AddFields(
diff --git a/pkg/batch/api/api_test.go b/pkg/batch/api/api_test.go
index 0003885871..add8b7339f 100644
--- a/pkg/batch/api/api_test.go
+++ b/pkg/batch/api/api_test.go
@@ -30,6 +30,7 @@ import (
autoopsdomain "github.com/bucketeer-io/bucketeer/pkg/autoops/domain"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs"
cacher "github.com/bucketeer-io/bucketeer/pkg/batch/jobs/cacher"
+ deleter "github.com/bucketeer-io/bucketeer/pkg/batch/jobs/deleter"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/experiment"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/mau"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/notification"
@@ -843,6 +844,7 @@ func newBatchService(t *testing.T,
autoOpsRulesMockClient,
redisMockClient,
),
+ deleter.NewTagDeleter(mysqlMockClient),
logger,
)
return service
diff --git a/pkg/batch/cmd/server/server.go b/pkg/batch/cmd/server/server.go
index 8cb4ba3dcb..e3575eae1f 100644
--- a/pkg/batch/cmd/server/server.go
+++ b/pkg/batch/cmd/server/server.go
@@ -30,6 +30,7 @@ import (
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs"
cacher "github.com/bucketeer-io/bucketeer/pkg/batch/jobs/cacher"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/calculator"
+ "github.com/bucketeer-io/bucketeer/pkg/batch/jobs/deleter"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/experiment"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/mau"
"github.com/bucketeer-io/bucketeer/pkg/batch/jobs/notification"
@@ -559,6 +560,11 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
cachev3.NewRedisCache(persistentRedisClient),
jobs.WithLogger(logger),
),
+ deleter.NewTagDeleter(
+ mysqlClient,
+ jobs.WithTimeout(5*time.Minute),
+ jobs.WithLogger(logger),
+ ),
logger,
)
diff --git a/pkg/batch/jobs/deleter/tag_deleter.go b/pkg/batch/jobs/deleter/tag_deleter.go
new file mode 100644
index 0000000000..af13536d8b
--- /dev/null
+++ b/pkg/batch/jobs/deleter/tag_deleter.go
@@ -0,0 +1,176 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package deleter
+
+import (
+ "context"
+ "errors"
+ "time"
+
+ "go.uber.org/zap"
+
+ "github.com/bucketeer-io/bucketeer/pkg/batch/jobs"
+ ftstorage "github.com/bucketeer-io/bucketeer/pkg/feature/storage/v2"
+ "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+ tagstorage "github.com/bucketeer-io/bucketeer/pkg/tag/storage"
+ ftproto "github.com/bucketeer-io/bucketeer/proto/feature"
+ tagproto "github.com/bucketeer-io/bucketeer/proto/tag"
+)
+
+var (
+ errInternal = errors.New("batch: internal error")
+)
+
+type tagDeleter struct {
+ tagStorage tagstorage.TagStorage
+ ftStorage ftstorage.FeatureStorage
+ opts *jobs.Options
+ logger *zap.Logger
+}
+
+func NewTagDeleter(
+ mysqlClient mysql.Client,
+ opts ...jobs.Option) jobs.Job {
+
+ dopts := &jobs.Options{
+ Timeout: 1 * time.Minute,
+ Logger: zap.NewNop(),
+ }
+ for _, opt := range opts {
+ opt(dopts)
+ }
+ return &tagDeleter{
+ tagStorage: tagstorage.NewTagStorage(mysqlClient),
+ ftStorage: ftstorage.NewFeatureStorage(mysqlClient),
+ opts: dopts,
+ logger: dopts.Logger.Named("tag-deleter"),
+ }
+}
+
+func (td *tagDeleter) Run(ctx context.Context) (lastErr error) {
+ ctx, cancel := context.WithTimeout(ctx, td.opts.Timeout)
+ defer cancel()
+
+ td.logger.Info("Starting to delete unused tags")
+ startTime := time.Now()
+ // List all the tags by environment
+ envTags, err := td.tagStorage.ListAllEnvironmentTags(ctx)
+ if err != nil {
+ td.logger.Error("Failed to list all environment tags", zap.Error(err))
+ return errInternal
+ }
+ // List all the features by environment
+ envFts, err := td.ftStorage.ListAllEnvironmentFeatures(ctx)
+ if err != nil {
+ td.logger.Error("Failed to list all environment features", zap.Error(err))
+ return errInternal
+ }
+
+ var deletedSize int
+ for _, envTag := range envTags {
+ // Delete all the tags when there are no flags
+ if len(envFts) == 0 {
+ for _, tag := range envTag.Tags {
+ // Delete unused tag
+ if err := td.deleteTag(ctx, tag); err != nil {
+ lastErr = err
+ continue
+ }
+ deletedSize++
+ }
+ } else {
+ // Check if the tags are in use in all the flags
+ for _, envFt := range envFts {
+ if envFt.EnvironmentId == envTag.EnvironmentId {
+ deletedCount, err := td.deleteUnusedTags(ctx, envTag.Tags, envFt.Features)
+ if err != nil {
+ lastErr = err
+ continue
+ }
+ deletedSize += deletedCount
+ }
+ }
+ }
+ }
+
+ if lastErr != nil {
+ td.logger.Error("Finished deleting unused tags with errors",
+ zap.Error(lastErr),
+ zap.Duration("elapsedTime", time.Since(startTime)),
+ zap.Int("deletedSize", deletedSize),
+ )
+ } else {
+ td.logger.Info("Finished deleting unused tags",
+ zap.Duration("elapsedTime", time.Since(startTime)),
+ zap.Int("deletedSize", deletedSize),
+ )
+ }
+ return
+}
+
+func (td *tagDeleter) deleteUnusedTags(
+ ctx context.Context,
+ tags []*tagproto.Tag,
+ fts []*ftproto.Feature,
+) (int, error) {
+ var deletedCount int
+ for _, tag := range tags {
+ var inUse bool
+ for _, ft := range fts {
+ // Check if the tag is in use
+ if td.contains(tag.Name, ft.Tags) {
+ inUse = true
+ break
+ }
+ }
+ // Skip deleting if the tag is in use
+ if inUse {
+ continue
+ }
+ // Delete unused tag
+ if err := td.deleteTag(ctx, tag); err != nil {
+ return deletedCount, err
+ }
+ deletedCount++
+ }
+ return deletedCount, nil
+}
+
+func (td *tagDeleter) deleteTag(ctx context.Context, tag *tagproto.Tag) error {
+ if err := td.tagStorage.DeleteTag(ctx, tag.Id, tag.EnvironmentId); err != nil {
+ td.logger.Error("Failed to delete the tag",
+ zap.Error(err),
+ zap.String("tagId", tag.Id),
+ zap.String("tagName", tag.Name),
+ zap.String("environmentId", tag.EnvironmentId),
+ )
+ return errInternal
+ }
+ td.logger.Debug("Deleted tag successfully",
+ zap.String("tagId", tag.Id),
+ zap.String("tagName", tag.Name),
+ zap.String("environmentId", tag.EnvironmentId),
+ )
+ return nil
+}
+
+func (td *tagDeleter) contains(needle string, haystack []string) bool {
+ for i := range haystack {
+ if haystack[i] == needle {
+ return true
+ }
+ }
+ return false
+}
diff --git a/pkg/batch/jobs/deleter/tag_deleter_test.go b/pkg/batch/jobs/deleter/tag_deleter_test.go
new file mode 100644
index 0000000000..5ea1986a69
--- /dev/null
+++ b/pkg/batch/jobs/deleter/tag_deleter_test.go
@@ -0,0 +1,357 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package deleter
+
+import (
+ "context"
+ "errors"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "go.uber.org/mock/gomock"
+
+ "github.com/bucketeer-io/bucketeer/pkg/batch/jobs"
+ ftstoragemock "github.com/bucketeer-io/bucketeer/pkg/feature/storage/v2/mock"
+ "github.com/bucketeer-io/bucketeer/pkg/log"
+ tagstoragemock "github.com/bucketeer-io/bucketeer/pkg/tag/storage/mock"
+ ftproto "github.com/bucketeer-io/bucketeer/proto/feature"
+ tagproto "github.com/bucketeer-io/bucketeer/proto/tag"
+)
+
+func TestRun(t *testing.T) {
+ t.Parallel()
+ mockController := gomock.NewController(t)
+ defer mockController.Finish()
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ patterns := []struct {
+ desc string
+ setup func(td *tagDeleter)
+ expected error
+ }{
+ {
+ desc: "err: internal error when listing all environment tags",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().ListAllEnvironmentTags(gomock.Any()).Return(
+ nil,
+ errors.New("internal error"),
+ )
+ },
+ expected: errInternal,
+ },
+ {
+ desc: "err: internal error when listing all environment features",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().ListAllEnvironmentTags(gomock.Any()).Return(
+ []*tagproto.EnvironmentTag{},
+ nil,
+ )
+ td.ftStorage.(*ftstoragemock.MockFeatureStorage).EXPECT().ListAllEnvironmentFeatures(gomock.Any()).Return(
+ nil,
+ errors.New("internal error"),
+ )
+ },
+ expected: errInternal,
+ },
+ {
+ desc: "err: internal error when deleting tag",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().ListAllEnvironmentTags(gomock.Any()).Return(
+ []*tagproto.EnvironmentTag{
+ {
+ EnvironmentId: "env-id-1",
+ Tags: []*tagproto.Tag{
+ {
+ Id: "tag-id-1",
+ Name: "android",
+ EnvironmentId: "env-id-1",
+ },
+ },
+ },
+ },
+ nil,
+ )
+ td.ftStorage.(*ftstoragemock.MockFeatureStorage).EXPECT().ListAllEnvironmentFeatures(gomock.Any()).Return(
+ []*ftproto.EnvironmentFeature{},
+ nil,
+ )
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-1", "env-id-1").Return(errors.New("internal error"))
+ },
+ expected: errInternal,
+ },
+ {
+ desc: "success: delete tags by checking the flags",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().ListAllEnvironmentTags(gomock.Any()).Return(
+ []*tagproto.EnvironmentTag{
+ {
+ EnvironmentId: "env-id-1",
+ Tags: []*tagproto.Tag{
+ {
+ Id: "tag-id-1",
+ Name: "android",
+ EnvironmentId: "env-id-1",
+ },
+ {
+ Id: "tag-id-2",
+ Name: "web",
+ EnvironmentId: "env-id-1",
+ },
+ {
+ Id: "tag-id-3",
+ Name: "server",
+ EnvironmentId: "env-id-1",
+ },
+ },
+ },
+ {
+ EnvironmentId: "env-id-2",
+ Tags: []*tagproto.Tag{
+ {
+ Id: "tag-id-4",
+ Name: "android",
+ EnvironmentId: "env-id-2",
+ },
+ {
+ Id: "tag-id-5",
+ Name: "ios",
+ EnvironmentId: "env-id-2",
+ },
+ },
+ },
+ },
+ nil,
+ )
+ td.ftStorage.(*ftstoragemock.MockFeatureStorage).EXPECT().ListAllEnvironmentFeatures(gomock.Any()).Return(
+ []*ftproto.EnvironmentFeature{
+ {
+ EnvironmentId: "env-id-1",
+ Features: []*ftproto.Feature{
+ {
+ Id: "feature-id-1",
+ Tags: []string{"android"},
+ },
+ {
+ Id: "feature-id-2",
+ Tags: []string{"server"},
+ },
+ },
+ },
+ {
+ EnvironmentId: "env-id-2",
+ Features: []*ftproto.Feature{
+ {
+ Id: "feature-id-1",
+ Tags: []string{"ios"},
+ },
+ },
+ },
+ },
+ nil,
+ )
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-2", "env-id-1").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-4", "env-id-2").Return(nil)
+ },
+ expected: nil,
+ },
+ {
+ desc: "success: delete all the tags when there are no flags",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().ListAllEnvironmentTags(gomock.Any()).Return(
+ []*tagproto.EnvironmentTag{
+ {
+ EnvironmentId: "env-id-1",
+ Tags: []*tagproto.Tag{
+ {
+ Id: "tag-id-1",
+ Name: "android",
+ EnvironmentId: "env-id-1",
+ },
+ {
+ Id: "tag-id-2",
+ Name: "web",
+ EnvironmentId: "env-id-1",
+ },
+ {
+ Id: "tag-id-3",
+ Name: "server",
+ EnvironmentId: "env-id-1",
+ },
+ },
+ },
+ {
+ EnvironmentId: "env-id-2",
+ Tags: []*tagproto.Tag{
+ {
+ Id: "tag-id-4",
+ Name: "android",
+ EnvironmentId: "env-id-2",
+ },
+ {
+ Id: "tag-id-5",
+ Name: "ios",
+ EnvironmentId: "env-id-2",
+ },
+ },
+ },
+ },
+ nil,
+ )
+ td.ftStorage.(*ftstoragemock.MockFeatureStorage).EXPECT().ListAllEnvironmentFeatures(gomock.Any()).Return(
+ []*ftproto.EnvironmentFeature{},
+ nil,
+ )
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-1", "env-id-1").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-2", "env-id-1").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-3", "env-id-1").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-4", "env-id-2").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(
+ gomock.Any(), "tag-id-5", "env-id-2").Return(nil)
+ },
+ expected: nil,
+ },
+ }
+
+ for _, p := range patterns {
+ t.Run(p.desc, func(t *testing.T) {
+ deleter := newMockTagDeleter(t, mockController)
+ p.setup(deleter)
+ err := deleter.Run(ctx)
+ assert.Equal(t, p.expected, err)
+ })
+ }
+}
+
+func TestDeleteUnusedTags(t *testing.T) {
+ t.Parallel()
+ mockController := gomock.NewController(t)
+ defer mockController.Finish()
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ patterns := []struct {
+ desc string
+ setup func(td *tagDeleter)
+ inputTags []*tagproto.Tag
+ inputFts []*ftproto.Feature
+ expectedCount int
+ expectedError error
+ }{
+ {
+ desc: "err: internal error while deleting 2 entries, but only 1 one is deleted",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(ctx, "tag-id-2", "env-id").Return(nil)
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(ctx, "tag-id-3", "env-id").
+ Return(errors.New("internal error"))
+ },
+ inputTags: []*tagproto.Tag{
+ {
+ Id: "tag-id-1",
+ Name: "android",
+ EnvironmentId: "env-id",
+ },
+ {
+ Id: "tag-id-2",
+ Name: "server",
+ EnvironmentId: "env-id",
+ },
+ {
+ Id: "tag-id-3",
+ Name: "ios",
+ EnvironmentId: "env-id",
+ },
+ },
+ inputFts: []*ftproto.Feature{
+ {
+ Id: "feature-id-1",
+ Tags: []string{"android"},
+ },
+ },
+ expectedCount: 1,
+ expectedError: errInternal,
+ },
+ {
+ desc: "success",
+ setup: func(td *tagDeleter) {
+ td.tagStorage.(*tagstoragemock.MockTagStorage).EXPECT().DeleteTag(ctx, "tag-id-2", "env-id").Return(nil)
+ },
+ inputTags: []*tagproto.Tag{
+ {
+ Id: "tag-id-1",
+ Name: "android",
+ EnvironmentId: "env-id",
+ },
+ {
+ Id: "tag-id-2",
+ Name: "server",
+ EnvironmentId: "env-id",
+ },
+ {
+ Id: "tag-id-3",
+ Name: "ios",
+ EnvironmentId: "env-id",
+ },
+ },
+ inputFts: []*ftproto.Feature{
+ {
+ Id: "feature-id-1",
+ Tags: []string{"android"},
+ },
+ {
+ Id: "feature-id-2",
+ Tags: []string{"ios"},
+ },
+ },
+ expectedCount: 1,
+ expectedError: nil,
+ },
+ }
+
+ for _, p := range patterns {
+ t.Run(p.desc, func(t *testing.T) {
+ deleter := newMockTagDeleter(t, mockController)
+ p.setup(deleter)
+ deletedCount, err := deleter.deleteUnusedTags(ctx, p.inputTags, p.inputFts)
+ assert.Equal(t, p.expectedError, err)
+ assert.Equal(t, p.expectedCount, deletedCount)
+ })
+ }
+}
+
+func newMockTagDeleter(t *testing.T, c *gomock.Controller) *tagDeleter {
+ t.Helper()
+ logger, err := log.NewLogger()
+ require.NoError(t, err)
+ return &tagDeleter{
+ tagStorage: tagstoragemock.NewMockTagStorage(c),
+ ftStorage: ftstoragemock.NewMockFeatureStorage(c),
+ opts: &jobs.Options{
+ Timeout: 5 * time.Second,
+ },
+ logger: logger,
+ }
+}
diff --git a/pkg/batch/jobs/rediscounter/redis_counter_deleter_test.go b/pkg/batch/jobs/rediscounter/redis_counter_deleter_test.go
index 04a3337d4c..dfe27266b0 100644
--- a/pkg/batch/jobs/rediscounter/redis_counter_deleter_test.go
+++ b/pkg/batch/jobs/rediscounter/redis_counter_deleter_test.go
@@ -316,7 +316,7 @@ func TestFilterKeysOlderThanThirtyOneDays(t *testing.T) {
expectedError: errSubmatchStringNotFound,
},
{
- desc: "success: using empty environment namespace",
+ desc: "success: using empty environment id",
inputEnvNamespace: "",
inputKind: "uc",
inputKeys: []string{
diff --git a/pkg/cache/v3/environment_api_key.go b/pkg/cache/v3/environment_api_key.go
index 6881e5079a..c21c4b246f 100644
--- a/pkg/cache/v3/environment_api_key.go
+++ b/pkg/cache/v3/environment_api_key.go
@@ -70,6 +70,6 @@ func (c *environmentAPIKeyCache) Put(environmentAPIKey *accountproto.Environment
}
func (c *environmentAPIKeyCache) key(id string) string {
- // always use AdminEnvironmentNamespace because we'd like to get APIKey and environment_id only by id
+ // always use AdminEnvironmentId because we'd like to get APIKey and environment_id only by id
return cache.MakeKey(environmentAPIKeyKind, id, storage.AdminEnvironmentID)
}
diff --git a/pkg/coderef/api/api.go b/pkg/coderef/api/api.go
new file mode 100644
index 0000000000..ee49200d3c
--- /dev/null
+++ b/pkg/coderef/api/api.go
@@ -0,0 +1,156 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "context"
+
+ "go.uber.org/zap"
+ "google.golang.org/genproto/googleapis/rpc/errdetails"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+
+ accountclient "github.com/bucketeer-io/bucketeer/pkg/account/client"
+ "github.com/bucketeer-io/bucketeer/pkg/locale"
+ "github.com/bucketeer-io/bucketeer/pkg/log"
+ "github.com/bucketeer-io/bucketeer/pkg/pubsub/publisher"
+ "github.com/bucketeer-io/bucketeer/pkg/role"
+ mysql "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+ accountproto "github.com/bucketeer-io/bucketeer/proto/account"
+ proto "github.com/bucketeer-io/bucketeer/proto/coderef"
+ eventproto "github.com/bucketeer-io/bucketeer/proto/event/domain"
+)
+
+type options struct {
+ logger *zap.Logger
+}
+
+type Option func(*options)
+
+func WithLogger(logger *zap.Logger) Option {
+ return func(opts *options) {
+ opts.logger = logger
+ }
+}
+
+type CodeReferenceService struct {
+ accountClient accountclient.Client
+ mysqlClient mysql.Client
+ publisher publisher.Publisher
+ opts *options
+ logger *zap.Logger
+}
+
+func NewCodeReferenceService(
+ ac accountclient.Client,
+ mysqlClient mysql.Client,
+ p publisher.Publisher,
+ opts ...Option,
+) *CodeReferenceService {
+ dopts := &options{
+ logger: zap.NewNop(),
+ }
+ for _, opt := range opts {
+ opt(dopts)
+ }
+ return &CodeReferenceService{
+ accountClient: ac,
+ mysqlClient: mysqlClient,
+ publisher: p,
+ opts: dopts,
+ logger: dopts.logger.Named("api"),
+ }
+}
+
+func (s *CodeReferenceService) Register(server *grpc.Server) {
+ proto.RegisterCodeReferenceServiceServer(server, s)
+}
+
+func (s *CodeReferenceService) checkEnvironmentRole(
+ ctx context.Context,
+ requiredRole accountproto.AccountV2_Role_Environment,
+ environmentID string,
+ localizer locale.Localizer,
+) (*eventproto.Editor, error) {
+ editor, err := role.CheckEnvironmentRole(
+ ctx,
+ requiredRole,
+ environmentID,
+ func(email string) (*accountproto.AccountV2, error) {
+ resp, err := s.accountClient.GetAccountV2ByEnvironmentID(ctx, &accountproto.GetAccountV2ByEnvironmentIDRequest{
+ Email: email,
+ EnvironmentId: environmentID,
+ })
+ if err != nil {
+ return nil, err
+ }
+ return resp.Account, nil
+ },
+ )
+ if err != nil {
+ switch status.Code(err) {
+ case codes.Unauthenticated:
+ s.logger.Info(
+ "Unauthenticated",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", environmentID),
+ )...,
+ )
+ dt, err := statusUnauthenticated.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.UnauthenticatedError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ case codes.PermissionDenied:
+ s.logger.Info(
+ "Permission denied",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", environmentID),
+ )...,
+ )
+ dt, err := statusPermissionDenied.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.PermissionDenied),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ default:
+ s.logger.Error(
+ "Failed to check role",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", environmentID),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ }
+ return editor, nil
+}
diff --git a/pkg/coderef/api/code_reference.go b/pkg/coderef/api/code_reference.go
new file mode 100644
index 0000000000..67b0c6019a
--- /dev/null
+++ b/pkg/coderef/api/code_reference.go
@@ -0,0 +1,615 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "strconv"
+
+ "go.uber.org/zap"
+ "google.golang.org/genproto/googleapis/rpc/errdetails"
+
+ "github.com/bucketeer-io/bucketeer/pkg/coderef/domain"
+ "github.com/bucketeer-io/bucketeer/pkg/coderef/storage"
+ domainevent "github.com/bucketeer-io/bucketeer/pkg/domainevent/domain"
+ "github.com/bucketeer-io/bucketeer/pkg/locale"
+ "github.com/bucketeer-io/bucketeer/pkg/log"
+ "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+ accountproto "github.com/bucketeer-io/bucketeer/proto/account"
+ proto "github.com/bucketeer-io/bucketeer/proto/coderef"
+ eventproto "github.com/bucketeer-io/bucketeer/proto/event/domain"
+)
+
+// generateSourceURL generates a URL to view the code in the repository web interface
+func generateSourceURL(codeRef *proto.CodeReference) string {
+ switch codeRef.RepositoryType {
+ case proto.CodeReference_GITHUB:
+ return fmt.Sprintf("https://github.com/%s/%s/blob/%s/%s#L%d",
+ codeRef.RepositoryOwner,
+ codeRef.RepositoryName,
+ codeRef.CommitHash,
+ codeRef.FilePath,
+ codeRef.LineNumber)
+ case proto.CodeReference_GITLAB:
+ return fmt.Sprintf("https://gitlab.com/%s/%s/-/blob/%s/%s#L%d",
+ codeRef.RepositoryOwner,
+ codeRef.RepositoryName,
+ codeRef.CommitHash,
+ codeRef.FilePath,
+ codeRef.LineNumber)
+ case proto.CodeReference_BITBUCKET:
+ return fmt.Sprintf("https://bitbucket.org/%s/%s/src/%s/%s#lines-%d",
+ codeRef.RepositoryOwner,
+ codeRef.RepositoryName,
+ codeRef.CommitHash,
+ codeRef.FilePath,
+ codeRef.LineNumber)
+ default:
+ return ""
+ }
+}
+
+func (s *CodeReferenceService) GetCodeReference(
+ ctx context.Context,
+ req *proto.GetCodeReferenceRequest,
+) (*proto.GetCodeReferenceResponse, error) {
+ localizer := locale.NewLocalizer(ctx)
+ _, err := s.checkEnvironmentRole(
+ ctx,
+ accountproto.AccountV2_Role_Environment_VIEWER,
+ req.EnvironmentId,
+ localizer,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if err := validateGetCodeReferenceRequest(req, localizer); err != nil {
+ return nil, err
+ }
+ codeRefStorage := storage.NewCodeReferenceStorage(s.mysqlClient)
+ codeRef, err := codeRefStorage.GetCodeReference(ctx, req.Id)
+ if err != nil {
+ if errors.Is(err, storage.ErrCodeReferenceNotFound) {
+ dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ s.logger.Error(
+ "Failed to get code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ codeRef.CodeReference.SourceUrl = generateSourceURL(&codeRef.CodeReference)
+ return &proto.GetCodeReferenceResponse{CodeReference: &codeRef.CodeReference}, nil
+}
+
+func (s *CodeReferenceService) ListCodeReferences(
+ ctx context.Context,
+ req *proto.ListCodeReferencesRequest,
+) (*proto.ListCodeReferencesResponse, error) {
+ localizer := locale.NewLocalizer(ctx)
+ _, err := s.checkEnvironmentRole(
+ ctx,
+ accountproto.AccountV2_Role_Environment_VIEWER,
+ req.EnvironmentId,
+ localizer,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if err := validateListCodeReferencesRequest(req, localizer); err != nil {
+ return nil, err
+ }
+ whereParts := []mysql.WherePart{
+ mysql.NewFilter("environment_id", "=", req.EnvironmentId),
+ }
+ if req.FeatureId != "" {
+ whereParts = append(whereParts, mysql.NewFilter("feature_id", "=", req.FeatureId))
+ }
+ if req.RepositoryName != "" {
+ whereParts = append(whereParts, mysql.NewFilter("repository_name", "=", req.RepositoryName))
+ }
+ if req.RepositoryOwner != "" {
+ whereParts = append(whereParts, mysql.NewFilter("repository_owner", "=", req.RepositoryOwner))
+ }
+ if req.RepositoryType != proto.CodeReference_REPOSITORY_TYPE_UNSPECIFIED {
+ whereParts = append(whereParts, mysql.NewFilter("repository_type", "=", req.RepositoryType))
+ }
+ if req.RepositoryBranch != "" {
+ whereParts = append(whereParts, mysql.NewFilter("repository_branch", "=", req.RepositoryBranch))
+ }
+ if req.FileExtension != "" {
+ whereParts = append(whereParts, mysql.NewFilter("file_path", "LIKE", "%"+req.FileExtension))
+ }
+ orders := []*mysql.Order{mysql.NewOrder("id", mysql.OrderDirectionAsc)}
+ switch req.OrderBy {
+ case proto.ListCodeReferencesRequest_CREATED_AT:
+ orders = []*mysql.Order{mysql.NewOrder("created_at", s.toMySQLOrderDirection(req.OrderDirection))}
+ case proto.ListCodeReferencesRequest_UPDATED_AT:
+ orders = []*mysql.Order{mysql.NewOrder("updated_at", s.toMySQLOrderDirection(req.OrderDirection))}
+ }
+ limit := int(req.PageSize)
+ cursor := 0
+ if req.Cursor != "" {
+ c, err := strconv.Atoi(req.Cursor)
+ if err != nil {
+ dt, err := statusInvalidCursor.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InvalidArgumentError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ cursor = c
+ }
+ codeRefStorage := storage.NewCodeReferenceStorage(s.mysqlClient)
+ codeRefs, nextCursor, totalCount, err := codeRefStorage.ListCodeReferences(
+ ctx,
+ whereParts,
+ orders,
+ limit,
+ cursor,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to list code references",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ protoRefs := make([]*proto.CodeReference, 0, len(codeRefs))
+ for _, ref := range codeRefs {
+ ref.CodeReference.SourceUrl = generateSourceURL(&ref.CodeReference)
+ protoRefs = append(protoRefs, &ref.CodeReference)
+ }
+ return &proto.ListCodeReferencesResponse{
+ CodeReferences: protoRefs,
+ Cursor: strconv.Itoa(nextCursor),
+ TotalCount: totalCount,
+ }, nil
+}
+
+func (s *CodeReferenceService) CreateCodeReference(
+ ctx context.Context,
+ req *proto.CreateCodeReferenceRequest,
+) (*proto.CreateCodeReferenceResponse, error) {
+ localizer := locale.NewLocalizer(ctx)
+ editor, err := s.checkEnvironmentRole(
+ ctx,
+ accountproto.AccountV2_Role_Environment_EDITOR,
+ req.EnvironmentId,
+ localizer,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if err := validateCreateCodeReferenceRequest(req, localizer); err != nil {
+ return nil, err
+ }
+ codeRef, err := domain.NewCodeReference(
+ req.FeatureId,
+ req.FilePath,
+ req.LineNumber,
+ req.CodeSnippet,
+ req.ContentHash,
+ req.Aliases,
+ req.RepositoryName,
+ req.RepositoryOwner,
+ req.RepositoryType,
+ req.RepositoryBranch,
+ req.CommitHash,
+ req.EnvironmentId,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to create code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ codeRefStorage := storage.NewCodeReferenceStorage(s.mysqlClient)
+ if err := codeRefStorage.CreateCodeReference(ctx, codeRef); err != nil {
+ s.logger.Error(
+ "Failed to create code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", codeRef.Id),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ createEvent, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_CODEREF,
+ codeRef.Id,
+ eventproto.Event_CODE_REFERENCE_CREATED,
+ &eventproto.CodeReferenceCreatedEvent{
+ Id: codeRef.Id,
+ FeatureId: codeRef.FeatureId,
+ FilePath: codeRef.FilePath,
+ LineNumber: codeRef.LineNumber,
+ CodeSnippet: codeRef.CodeSnippet,
+ ContentHash: codeRef.ContentHash,
+ Aliases: codeRef.Aliases,
+ RepositoryName: codeRef.RepositoryName,
+ RepositoryOwner: codeRef.RepositoryOwner,
+ RepositoryType: codeRef.RepositoryType,
+ RepositoryBranch: codeRef.RepositoryBranch,
+ CommitHash: codeRef.CommitHash,
+ EnvironmentId: codeRef.EnvironmentId,
+ CreatedAt: codeRef.CreatedAt,
+ UpdatedAt: codeRef.UpdatedAt,
+ },
+ req.EnvironmentId,
+ codeRef,
+ nil,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to create event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ if err := s.publisher.Publish(ctx, createEvent); err != nil {
+ s.logger.Error(
+ "Failed to publish event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ return &proto.CreateCodeReferenceResponse{CodeReference: &codeRef.CodeReference}, nil
+}
+
+func (s *CodeReferenceService) UpdateCodeReference(
+ ctx context.Context,
+ req *proto.UpdateCodeReferenceRequest,
+) (*proto.UpdateCodeReferenceResponse, error) {
+ localizer := locale.NewLocalizer(ctx)
+ editor, err := s.checkEnvironmentRole(
+ ctx,
+ accountproto.AccountV2_Role_Environment_EDITOR,
+ req.EnvironmentId,
+ localizer,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if err := validateUpdateCodeReferenceRequest(req, localizer); err != nil {
+ return nil, err
+ }
+ codeRefStorage := storage.NewCodeReferenceStorage(s.mysqlClient)
+ var codeRef *domain.CodeReference
+ var updatedCodeRef *domain.CodeReference
+ err = codeRefStorage.RunInTransaction(ctx, func() error {
+ var err error
+ codeRef, err = codeRefStorage.GetCodeReference(ctx, req.Id)
+ if err != nil {
+ if errors.Is(err, storage.ErrCodeReferenceNotFound) {
+ dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ s.logger.Error(
+ "Failed to get code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ updatedCodeRef, err = codeRef.Update(
+ req.FilePath,
+ req.LineNumber,
+ req.CodeSnippet,
+ req.ContentHash,
+ req.Aliases,
+ req.RepositoryBranch,
+ req.CommitHash,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to update code reference domain object",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if err := codeRefStorage.UpdateCodeReference(ctx, updatedCodeRef); err != nil {
+ s.logger.Error(
+ "Failed to update code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ updateEvent, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_CODEREF,
+ updatedCodeRef.Id,
+ eventproto.Event_CODE_REFERENCE_UPDATED,
+ &eventproto.CodeReferenceUpdatedEvent{
+ Id: updatedCodeRef.Id,
+ FilePath: updatedCodeRef.FilePath,
+ LineNumber: updatedCodeRef.LineNumber,
+ CodeSnippet: updatedCodeRef.CodeSnippet,
+ ContentHash: updatedCodeRef.ContentHash,
+ Aliases: updatedCodeRef.Aliases,
+ RepositoryBranch: updatedCodeRef.RepositoryBranch,
+ CommitHash: updatedCodeRef.CommitHash,
+ EnvironmentId: updatedCodeRef.EnvironmentId,
+ UpdatedAt: updatedCodeRef.UpdatedAt,
+ },
+ req.EnvironmentId,
+ updatedCodeRef,
+ codeRef,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to create event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ if err := s.publisher.Publish(ctx, updateEvent); err != nil {
+ s.logger.Error(
+ "Failed to publish event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ return &proto.UpdateCodeReferenceResponse{CodeReference: &updatedCodeRef.CodeReference}, nil
+}
+
+func (s *CodeReferenceService) DeleteCodeReference(
+ ctx context.Context,
+ req *proto.DeleteCodeReferenceRequest,
+) (*proto.DeleteCodeReferenceResponse, error) {
+ localizer := locale.NewLocalizer(ctx)
+ editor, err := s.checkEnvironmentRole(
+ ctx,
+ accountproto.AccountV2_Role_Environment_EDITOR,
+ req.EnvironmentId,
+ localizer,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if err := validateDeleteCodeReferenceRequest(req, localizer); err != nil {
+ return nil, err
+ }
+ codeRefStorage := storage.NewCodeReferenceStorage(s.mysqlClient)
+ codeRef, err := codeRefStorage.GetCodeReference(ctx, req.Id)
+ if err != nil {
+ if errors.Is(err, storage.ErrCodeReferenceNotFound) {
+ dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ s.logger.Error(
+ "Failed to get code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ if err := codeRefStorage.DeleteCodeReference(ctx, codeRef.Id); err != nil {
+ s.logger.Error(
+ "Failed to delete code reference",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("id", req.Id),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ deleteEvent, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_CODEREF,
+ codeRef.Id,
+ eventproto.Event_CODE_REFERENCE_DELETED,
+ &eventproto.CodeReferenceDeletedEvent{
+ Id: codeRef.Id,
+ EnvironmentId: codeRef.EnvironmentId,
+ },
+ req.EnvironmentId,
+ nil,
+ codeRef,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to create event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ if err := s.publisher.Publish(ctx, deleteEvent); err != nil {
+ s.logger.Error(
+ "Failed to publish event",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ return &proto.DeleteCodeReferenceResponse{}, nil
+}
+
+func (s *CodeReferenceService) toMySQLOrderDirection(
+ d proto.ListCodeReferencesRequest_OrderDirection,
+) mysql.OrderDirection {
+ if d == proto.ListCodeReferencesRequest_DESC {
+ return mysql.OrderDirectionDesc
+ }
+ return mysql.OrderDirectionAsc
+}
diff --git a/pkg/coderef/api/error.go b/pkg/coderef/api/error.go
new file mode 100644
index 0000000000..79a16c7900
--- /dev/null
+++ b/pkg/coderef/api/error.go
@@ -0,0 +1,37 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+)
+
+var (
+ statusInternal = status.New(codes.Internal, "coderef: internal")
+ statusInvalidCursor = status.New(codes.InvalidArgument, "coderef: invalid cursor")
+ statusMissingID = status.New(codes.InvalidArgument, "coderef: missing id")
+ statusMissingEnvironmentID = status.New(codes.InvalidArgument, "coderef: missing environment_id")
+ statusMissingFeatureID = status.New(codes.InvalidArgument, "coderef: missing feature_id")
+ statusMissingFilePath = status.New(codes.InvalidArgument, "coderef: missing file_path")
+ statusMissingLineNumber = status.New(codes.InvalidArgument, "coderef: missing line_number")
+ statusMissingCodeSnippet = status.New(codes.InvalidArgument, "coderef: missing code_snippet")
+ statusMissingContentHash = status.New(codes.InvalidArgument, "coderef: missing content_hash")
+ statusMissingRepositoryInfo = status.New(codes.InvalidArgument, "coderef: missing repository info")
+ statusInvalidRepositoryType = status.New(codes.InvalidArgument, "coderef: invalid repository type")
+ statusNotFound = status.New(codes.NotFound, "coderef: not found")
+ statusUnauthenticated = status.New(codes.Unauthenticated, "coderef: unauthenticated")
+ statusPermissionDenied = status.New(codes.PermissionDenied, "coderef: permission denied")
+)
diff --git a/pkg/coderef/api/validation.go b/pkg/coderef/api/validation.go
new file mode 100644
index 0000000000..df44535e50
--- /dev/null
+++ b/pkg/coderef/api/validation.go
@@ -0,0 +1,232 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "google.golang.org/genproto/googleapis/rpc/errdetails"
+
+ "github.com/bucketeer-io/bucketeer/pkg/locale"
+ proto "github.com/bucketeer-io/bucketeer/proto/coderef"
+)
+
+func validateCreateCodeReferenceRequest(req *proto.CreateCodeReferenceRequest, localizer locale.Localizer) error {
+ if req.FeatureId == "" {
+ dt, err := statusMissingFeatureID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "feature_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.FilePath == "" {
+ dt, err := statusMissingFilePath.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "file_path"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.LineNumber <= 0 {
+ dt, err := statusMissingLineNumber.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "line_number"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.CodeSnippet == "" {
+ dt, err := statusMissingCodeSnippet.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "code_snippet"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.ContentHash == "" {
+ dt, err := statusMissingContentHash.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "content_hash"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.RepositoryName == "" || req.RepositoryOwner == "" {
+ dt, err := statusMissingRepositoryInfo.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "repository_info"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.RepositoryType == proto.CodeReference_REPOSITORY_TYPE_UNSPECIFIED {
+ dt, err := statusInvalidRepositoryType.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.InvalidArgumentError, "repository_type"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.EnvironmentId == "" {
+ dt, err := statusMissingEnvironmentID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "environment_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
+func validateUpdateCodeReferenceRequest(req *proto.UpdateCodeReferenceRequest, localizer locale.Localizer) error {
+ if req.Id == "" {
+ dt, err := statusMissingID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.FilePath == "" {
+ dt, err := statusMissingFilePath.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "file_path"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.LineNumber <= 0 {
+ dt, err := statusMissingLineNumber.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "line_number"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.CodeSnippet == "" {
+ dt, err := statusMissingCodeSnippet.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "code_snippet"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.ContentHash == "" {
+ dt, err := statusMissingContentHash.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "content_hash"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.EnvironmentId == "" {
+ dt, err := statusMissingEnvironmentID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "environment_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
+func validateDeleteCodeReferenceRequest(req *proto.DeleteCodeReferenceRequest, localizer locale.Localizer) error {
+ if req.Id == "" {
+ dt, err := statusMissingID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.EnvironmentId == "" {
+ dt, err := statusMissingEnvironmentID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "environment_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
+func validateGetCodeReferenceRequest(req *proto.GetCodeReferenceRequest, localizer locale.Localizer) error {
+ if req.Id == "" {
+ dt, err := statusMissingID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.EnvironmentId == "" {
+ dt, err := statusMissingEnvironmentID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "environment_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
+func validateListCodeReferencesRequest(req *proto.ListCodeReferencesRequest, localizer locale.Localizer) error {
+ if req.EnvironmentId == "" {
+ dt, err := statusMissingEnvironmentID.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "environment_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
diff --git a/pkg/coderef/client/client.go b/pkg/coderef/client/client.go
new file mode 100644
index 0000000000..970cef7772
--- /dev/null
+++ b/pkg/coderef/client/client.go
@@ -0,0 +1,50 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:generate mockgen -source=$GOFILE -package=mock -destination=./mock/$GOFILE
+package client
+
+import (
+ "google.golang.org/grpc"
+
+ rpcclient "github.com/bucketeer-io/bucketeer/pkg/rpc/client"
+ proto "github.com/bucketeer-io/bucketeer/proto/coderef"
+)
+
+type Client interface {
+ proto.CodeReferenceServiceClient
+ Close()
+}
+
+type client struct {
+ proto.CodeReferenceServiceClient
+ address string
+ connection *grpc.ClientConn
+}
+
+func NewClient(addr, certPath string, opts ...rpcclient.Option) (Client, error) {
+ conn, err := rpcclient.NewClientConn(addr, certPath, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return &client{
+ CodeReferenceServiceClient: proto.NewCodeReferenceServiceClient(conn),
+ address: addr,
+ connection: conn,
+ }, nil
+}
+
+func (c *client) Close() {
+ c.connection.Close()
+}
diff --git a/pkg/coderef/client/mock/client.go b/pkg/coderef/client/mock/client.go
new file mode 100644
index 0000000000..d7f0435b8f
--- /dev/null
+++ b/pkg/coderef/client/mock/client.go
@@ -0,0 +1,155 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: client.go
+//
+// Generated by this command:
+//
+// mockgen -source=client.go -package=mock -destination=./mock/client.go
+//
+
+// Package mock is a generated GoMock package.
+package mock
+
+import (
+ context "context"
+ reflect "reflect"
+
+ gomock "go.uber.org/mock/gomock"
+ grpc "google.golang.org/grpc"
+
+ coderef "github.com/bucketeer-io/bucketeer/proto/coderef"
+)
+
+// MockClient is a mock of Client interface.
+type MockClient struct {
+ ctrl *gomock.Controller
+ recorder *MockClientMockRecorder
+}
+
+// MockClientMockRecorder is the mock recorder for MockClient.
+type MockClientMockRecorder struct {
+ mock *MockClient
+}
+
+// NewMockClient creates a new mock instance.
+func NewMockClient(ctrl *gomock.Controller) *MockClient {
+ mock := &MockClient{ctrl: ctrl}
+ mock.recorder = &MockClientMockRecorder{mock}
+ return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockClient) EXPECT() *MockClientMockRecorder {
+ return m.recorder
+}
+
+// Close mocks base method.
+func (m *MockClient) Close() {
+ m.ctrl.T.Helper()
+ m.ctrl.Call(m, "Close")
+}
+
+// Close indicates an expected call of Close.
+func (mr *MockClientMockRecorder) Close() *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockClient)(nil).Close))
+}
+
+// CreateCodeReference mocks base method.
+func (m *MockClient) CreateCodeReference(ctx context.Context, in *coderef.CreateCodeReferenceRequest, opts ...grpc.CallOption) (*coderef.CreateCodeReferenceResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []any{ctx, in}
+ for _, a := range opts {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "CreateCodeReference", varargs...)
+ ret0, _ := ret[0].(*coderef.CreateCodeReferenceResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// CreateCodeReference indicates an expected call of CreateCodeReference.
+func (mr *MockClientMockRecorder) CreateCodeReference(ctx, in any, opts ...any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]any{ctx, in}, opts...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCodeReference", reflect.TypeOf((*MockClient)(nil).CreateCodeReference), varargs...)
+}
+
+// DeleteCodeReference mocks base method.
+func (m *MockClient) DeleteCodeReference(ctx context.Context, in *coderef.DeleteCodeReferenceRequest, opts ...grpc.CallOption) (*coderef.DeleteCodeReferenceResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []any{ctx, in}
+ for _, a := range opts {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "DeleteCodeReference", varargs...)
+ ret0, _ := ret[0].(*coderef.DeleteCodeReferenceResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// DeleteCodeReference indicates an expected call of DeleteCodeReference.
+func (mr *MockClientMockRecorder) DeleteCodeReference(ctx, in any, opts ...any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]any{ctx, in}, opts...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteCodeReference", reflect.TypeOf((*MockClient)(nil).DeleteCodeReference), varargs...)
+}
+
+// GetCodeReference mocks base method.
+func (m *MockClient) GetCodeReference(ctx context.Context, in *coderef.GetCodeReferenceRequest, opts ...grpc.CallOption) (*coderef.GetCodeReferenceResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []any{ctx, in}
+ for _, a := range opts {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "GetCodeReference", varargs...)
+ ret0, _ := ret[0].(*coderef.GetCodeReferenceResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// GetCodeReference indicates an expected call of GetCodeReference.
+func (mr *MockClientMockRecorder) GetCodeReference(ctx, in any, opts ...any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]any{ctx, in}, opts...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCodeReference", reflect.TypeOf((*MockClient)(nil).GetCodeReference), varargs...)
+}
+
+// ListCodeReferences mocks base method.
+func (m *MockClient) ListCodeReferences(ctx context.Context, in *coderef.ListCodeReferencesRequest, opts ...grpc.CallOption) (*coderef.ListCodeReferencesResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []any{ctx, in}
+ for _, a := range opts {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "ListCodeReferences", varargs...)
+ ret0, _ := ret[0].(*coderef.ListCodeReferencesResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// ListCodeReferences indicates an expected call of ListCodeReferences.
+func (mr *MockClientMockRecorder) ListCodeReferences(ctx, in any, opts ...any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]any{ctx, in}, opts...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCodeReferences", reflect.TypeOf((*MockClient)(nil).ListCodeReferences), varargs...)
+}
+
+// UpdateCodeReference mocks base method.
+func (m *MockClient) UpdateCodeReference(ctx context.Context, in *coderef.UpdateCodeReferenceRequest, opts ...grpc.CallOption) (*coderef.UpdateCodeReferenceResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []any{ctx, in}
+ for _, a := range opts {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "UpdateCodeReference", varargs...)
+ ret0, _ := ret[0].(*coderef.UpdateCodeReferenceResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// UpdateCodeReference indicates an expected call of UpdateCodeReference.
+func (mr *MockClientMockRecorder) UpdateCodeReference(ctx, in any, opts ...any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]any{ctx, in}, opts...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCodeReference", reflect.TypeOf((*MockClient)(nil).UpdateCodeReference), varargs...)
+}
diff --git a/pkg/coderef/domain/code_reference.go b/pkg/coderef/domain/code_reference.go
new file mode 100644
index 0000000000..4dcbd6ccf2
--- /dev/null
+++ b/pkg/coderef/domain/code_reference.go
@@ -0,0 +1,106 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package domain
+
+import (
+ "time"
+
+ "github.com/google/uuid"
+ "github.com/jinzhu/copier"
+
+ proto "github.com/bucketeer-io/bucketeer/proto/coderef"
+)
+
+type CodeReference struct {
+ proto.CodeReference
+}
+
+func NewCodeReference(
+ featureId string,
+ filePath string,
+ lineNumber int32,
+ codeSnippet string,
+ contentHash string,
+ aliases []string,
+ repositoryName string,
+ repositoryOwner string,
+ repositoryType proto.CodeReference_RepositoryType,
+ repositoryBranch string,
+ commitHash string,
+ environmentId string,
+) (*CodeReference, error) {
+ id, err := uuid.NewUUID()
+ if err != nil {
+ return nil, err
+ }
+ now := time.Now().Unix()
+ return &CodeReference{
+ CodeReference: proto.CodeReference{
+ Id: id.String(),
+ FeatureId: featureId,
+ FilePath: filePath,
+ LineNumber: lineNumber,
+ CodeSnippet: codeSnippet,
+ ContentHash: contentHash,
+ Aliases: aliases,
+ RepositoryName: repositoryName,
+ RepositoryOwner: repositoryOwner,
+ RepositoryType: repositoryType,
+ RepositoryBranch: repositoryBranch,
+ CommitHash: commitHash,
+ EnvironmentId: environmentId,
+ CreatedAt: now,
+ UpdatedAt: now,
+ },
+ }, nil
+}
+
+func (c *CodeReference) Update(
+ filePath string,
+ lineNumber int32,
+ codeSnippet string,
+ contentHash string,
+ aliases []string,
+ repositoryBranch string,
+ commitHash string,
+) (*CodeReference, error) {
+ updated := &CodeReference{}
+ if err := copier.Copy(updated, c); err != nil {
+ return nil, err
+ }
+ if filePath != "" {
+ updated.FilePath = filePath
+ }
+ if lineNumber != 0 {
+ updated.LineNumber = lineNumber
+ }
+ if codeSnippet != "" {
+ updated.CodeSnippet = codeSnippet
+ }
+ if contentHash != "" {
+ updated.ContentHash = contentHash
+ }
+ if len(aliases) > 0 {
+ updated.Aliases = aliases
+ }
+ if repositoryBranch != "" {
+ updated.RepositoryBranch = repositoryBranch
+ }
+ if commitHash != "" {
+ updated.CommitHash = commitHash
+ }
+ updated.UpdatedAt = time.Now().Unix()
+ return updated, nil
+}
diff --git a/pkg/coderef/domain/errors.go b/pkg/coderef/domain/errors.go
new file mode 100644
index 0000000000..04727d2295
--- /dev/null
+++ b/pkg/coderef/domain/errors.go
@@ -0,0 +1,31 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package domain
+
+import "errors"
+
+var (
+ ErrInvalidFeatureID = errors.New("coderef: invalid feature id")
+ ErrInvalidFilePath = errors.New("coderef: invalid file path")
+ ErrInvalidLineNumber = errors.New("coderef: invalid line number")
+ ErrInvalidCodeSnippet = errors.New("coderef: invalid code snippet")
+ ErrInvalidContentHash = errors.New("coderef: invalid content hash")
+ ErrInvalidRepositoryName = errors.New("coderef: invalid repository name")
+ ErrInvalidRepositoryOwner = errors.New("coderef: invalid repository owner")
+ ErrInvalidRepositoryType = errors.New("coderef: invalid repository type")
+ ErrInvalidRepositoryBranch = errors.New("coderef: invalid repository branch")
+ ErrInvalidCommitHash = errors.New("coderef: invalid commit hash")
+ ErrInvalidEnvironmentID = errors.New("coderef: invalid environment id")
+)
diff --git a/pkg/coderef/storage/code_reference.go b/pkg/coderef/storage/code_reference.go
new file mode 100644
index 0000000000..f0a3829986
--- /dev/null
+++ b/pkg/coderef/storage/code_reference.go
@@ -0,0 +1,231 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package storage
+
+import (
+ "context"
+ _ "embed"
+ "errors"
+ "fmt"
+
+ "github.com/bucketeer-io/bucketeer/pkg/coderef/domain"
+ "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+)
+
+var (
+ //go:embed sql/code_reference/insert_code_reference.sql
+ insertCodeReferenceSQL string
+ //go:embed sql/code_reference/update_code_reference.sql
+ updateCodeReferenceSQL string
+ //go:embed sql/code_reference/select_code_reference.sql
+ selectCodeReferenceSQL string
+ //go:embed sql/code_reference/select_code_references.sql
+ selectCodeReferencesSQL string
+ //go:embed sql/code_reference/count_code_references.sql
+ countCodeReferencesSQL string
+ //go:embed sql/code_reference/delete_code_reference.sql
+ deleteCodeReferenceSQL string
+)
+
+var (
+ ErrCodeReferenceNotFound = errors.New("coderef: code reference not found")
+ ErrCodeReferenceUnexpectedAffectedRows = errors.New("coderef: code reference unexpected affected rows")
+)
+
+type codeReferenceStorage struct {
+ client mysql.Client
+}
+
+func NewCodeReferenceStorage(client mysql.Client) CodeReferenceStorage {
+ return &codeReferenceStorage{client}
+}
+
+func (s *codeReferenceStorage) RunInTransaction(ctx context.Context, f func() error) error {
+ tx, err := s.client.BeginTx(ctx)
+ if err != nil {
+ return fmt.Errorf("coderef: begin tx: %w", err)
+ }
+ ctx = context.WithValue(ctx, transactionKey, tx)
+ return s.client.RunInTransaction(ctx, tx, f)
+}
+
+func (s *codeReferenceStorage) qe(ctx context.Context) mysql.QueryExecer {
+ tx, ok := ctx.Value(transactionKey).(mysql.Transaction)
+ if ok {
+ return tx
+ }
+ return s.client
+}
+
+func (s *codeReferenceStorage) CreateCodeReference(ctx context.Context, cr *domain.CodeReference) error {
+ _, err := s.qe(ctx).ExecContext(
+ ctx,
+ insertCodeReferenceSQL,
+ cr.Id,
+ cr.FeatureId,
+ cr.FilePath,
+ cr.LineNumber,
+ cr.CodeSnippet,
+ cr.ContentHash,
+ mysql.JSONObject{Val: cr.Aliases},
+ cr.RepositoryName,
+ cr.RepositoryOwner,
+ cr.RepositoryType,
+ cr.RepositoryBranch,
+ cr.CommitHash,
+ cr.EnvironmentId,
+ cr.CreatedAt,
+ cr.UpdatedAt,
+ )
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (s *codeReferenceStorage) UpdateCodeReference(ctx context.Context, cr *domain.CodeReference) error {
+ result, err := s.qe(ctx).ExecContext(
+ ctx,
+ updateCodeReferenceSQL,
+ cr.FilePath,
+ cr.LineNumber,
+ cr.CodeSnippet,
+ cr.ContentHash,
+ mysql.JSONObject{Val: cr.Aliases},
+ cr.RepositoryName,
+ cr.RepositoryOwner,
+ cr.RepositoryType,
+ cr.RepositoryBranch,
+ cr.CommitHash,
+ cr.UpdatedAt,
+ cr.Id,
+ cr.EnvironmentId,
+ )
+ if err != nil {
+ return err
+ }
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return err
+ }
+ if rowsAffected != 1 {
+ return ErrCodeReferenceUnexpectedAffectedRows
+ }
+ return nil
+}
+
+func (s *codeReferenceStorage) GetCodeReference(
+ ctx context.Context,
+ id string,
+) (*domain.CodeReference, error) {
+ codeRef := &domain.CodeReference{}
+ row := s.qe(ctx).QueryRowContext(
+ ctx,
+ selectCodeReferenceSQL,
+ id,
+ )
+ err := row.Scan(
+ &codeRef.Id,
+ &codeRef.FeatureId,
+ &codeRef.FilePath,
+ &codeRef.LineNumber,
+ &codeRef.CodeSnippet,
+ &codeRef.ContentHash,
+ &mysql.JSONObject{Val: &codeRef.Aliases},
+ &codeRef.RepositoryName,
+ &codeRef.RepositoryOwner,
+ &codeRef.RepositoryType,
+ &codeRef.RepositoryBranch,
+ &codeRef.CommitHash,
+ &codeRef.EnvironmentId,
+ &codeRef.CreatedAt,
+ &codeRef.UpdatedAt,
+ )
+ if err != nil {
+ if errors.Is(err, mysql.ErrNoRows) {
+ return nil, ErrCodeReferenceNotFound
+ }
+ return nil, err
+ }
+ return codeRef, nil
+}
+
+func (s *codeReferenceStorage) ListCodeReferences(
+ ctx context.Context,
+ whereParts []mysql.WherePart,
+ orders []*mysql.Order,
+ limit, offset int,
+) ([]*domain.CodeReference, int, int64, error) {
+ whereSQL, whereArgs := mysql.ConstructWhereSQLString(whereParts)
+ orderBySQL := mysql.ConstructOrderBySQLString(orders)
+ limitOffsetSQL := mysql.ConstructLimitOffsetSQLString(limit, offset)
+ query := fmt.Sprintf("%s %s %s %s", selectCodeReferencesSQL, whereSQL, orderBySQL, limitOffsetSQL)
+ rows, err := s.qe(ctx).QueryContext(ctx, query, whereArgs...)
+ if err != nil {
+ return nil, 0, 0, err
+ }
+ defer rows.Close()
+ codeRefs := make([]*domain.CodeReference, 0, limit)
+ for rows.Next() {
+ codeRef := &domain.CodeReference{}
+ err := rows.Scan(
+ &codeRef.Id,
+ &codeRef.FeatureId,
+ &codeRef.FilePath,
+ &codeRef.LineNumber,
+ &codeRef.CodeSnippet,
+ &codeRef.ContentHash,
+ &mysql.JSONObject{Val: &codeRef.Aliases},
+ &codeRef.RepositoryName,
+ &codeRef.RepositoryOwner,
+ &codeRef.RepositoryType,
+ &codeRef.RepositoryBranch,
+ &codeRef.CommitHash,
+ &codeRef.EnvironmentId,
+ &codeRef.CreatedAt,
+ &codeRef.UpdatedAt,
+ )
+ if err != nil {
+ return nil, 0, 0, err
+ }
+ codeRefs = append(codeRefs, codeRef)
+ }
+ if rows.Err() != nil {
+ return nil, 0, 0, rows.Err()
+ }
+ nextOffset := offset + len(codeRefs)
+ var total int64
+ countQuery := fmt.Sprintf("%s %s", countCodeReferencesSQL, whereSQL)
+ row := s.qe(ctx).QueryRowContext(ctx, countQuery, whereArgs...)
+ if err := row.Scan(&total); err != nil {
+ return nil, 0, 0, err
+ }
+ return codeRefs, nextOffset, total, nil
+}
+
+func (s *codeReferenceStorage) DeleteCodeReference(ctx context.Context, id string) error {
+ result, err := s.qe(ctx).ExecContext(ctx, deleteCodeReferenceSQL, id)
+ if err != nil {
+ return err
+ }
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return err
+ }
+ if rowsAffected == 0 {
+ return ErrCodeReferenceNotFound
+ }
+ return nil
+}
diff --git a/pkg/coderef/storage/mock/storage.go b/pkg/coderef/storage/mock/storage.go
new file mode 100644
index 0000000000..b2bb926f74
--- /dev/null
+++ b/pkg/coderef/storage/mock/storage.go
@@ -0,0 +1,131 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: storage.go
+//
+// Generated by this command:
+//
+// mockgen -source=storage.go -package=mock -destination=./mock/storage.go
+//
+
+// Package mock is a generated GoMock package.
+package mock
+
+import (
+ context "context"
+ reflect "reflect"
+
+ gomock "go.uber.org/mock/gomock"
+
+ domain "github.com/bucketeer-io/bucketeer/pkg/coderef/domain"
+ mysql "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+)
+
+// MockCodeReferenceStorage is a mock of CodeReferenceStorage interface.
+type MockCodeReferenceStorage struct {
+ ctrl *gomock.Controller
+ recorder *MockCodeReferenceStorageMockRecorder
+}
+
+// MockCodeReferenceStorageMockRecorder is the mock recorder for MockCodeReferenceStorage.
+type MockCodeReferenceStorageMockRecorder struct {
+ mock *MockCodeReferenceStorage
+}
+
+// NewMockCodeReferenceStorage creates a new mock instance.
+func NewMockCodeReferenceStorage(ctrl *gomock.Controller) *MockCodeReferenceStorage {
+ mock := &MockCodeReferenceStorage{ctrl: ctrl}
+ mock.recorder = &MockCodeReferenceStorageMockRecorder{mock}
+ return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockCodeReferenceStorage) EXPECT() *MockCodeReferenceStorageMockRecorder {
+ return m.recorder
+}
+
+// CreateCodeReference mocks base method.
+func (m *MockCodeReferenceStorage) CreateCodeReference(ctx context.Context, codeRef *domain.CodeReference) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "CreateCodeReference", ctx, codeRef)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// CreateCodeReference indicates an expected call of CreateCodeReference.
+func (mr *MockCodeReferenceStorageMockRecorder) CreateCodeReference(ctx, codeRef any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCodeReference", reflect.TypeOf((*MockCodeReferenceStorage)(nil).CreateCodeReference), ctx, codeRef)
+}
+
+// DeleteCodeReference mocks base method.
+func (m *MockCodeReferenceStorage) DeleteCodeReference(ctx context.Context, id string) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DeleteCodeReference", ctx, id)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// DeleteCodeReference indicates an expected call of DeleteCodeReference.
+func (mr *MockCodeReferenceStorageMockRecorder) DeleteCodeReference(ctx, id any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteCodeReference", reflect.TypeOf((*MockCodeReferenceStorage)(nil).DeleteCodeReference), ctx, id)
+}
+
+// GetCodeReference mocks base method.
+func (m *MockCodeReferenceStorage) GetCodeReference(ctx context.Context, id string) (*domain.CodeReference, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "GetCodeReference", ctx, id)
+ ret0, _ := ret[0].(*domain.CodeReference)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// GetCodeReference indicates an expected call of GetCodeReference.
+func (mr *MockCodeReferenceStorageMockRecorder) GetCodeReference(ctx, id any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCodeReference", reflect.TypeOf((*MockCodeReferenceStorage)(nil).GetCodeReference), ctx, id)
+}
+
+// ListCodeReferences mocks base method.
+func (m *MockCodeReferenceStorage) ListCodeReferences(ctx context.Context, whereParts []mysql.WherePart, orders []*mysql.Order, limit, offset int) ([]*domain.CodeReference, int, int64, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "ListCodeReferences", ctx, whereParts, orders, limit, offset)
+ ret0, _ := ret[0].([]*domain.CodeReference)
+ ret1, _ := ret[1].(int)
+ ret2, _ := ret[2].(int64)
+ ret3, _ := ret[3].(error)
+ return ret0, ret1, ret2, ret3
+}
+
+// ListCodeReferences indicates an expected call of ListCodeReferences.
+func (mr *MockCodeReferenceStorageMockRecorder) ListCodeReferences(ctx, whereParts, orders, limit, offset any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCodeReferences", reflect.TypeOf((*MockCodeReferenceStorage)(nil).ListCodeReferences), ctx, whereParts, orders, limit, offset)
+}
+
+// RunInTransaction mocks base method.
+func (m *MockCodeReferenceStorage) RunInTransaction(ctx context.Context, f func() error) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "RunInTransaction", ctx, f)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// RunInTransaction indicates an expected call of RunInTransaction.
+func (mr *MockCodeReferenceStorageMockRecorder) RunInTransaction(ctx, f any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunInTransaction", reflect.TypeOf((*MockCodeReferenceStorage)(nil).RunInTransaction), ctx, f)
+}
+
+// UpdateCodeReference mocks base method.
+func (m *MockCodeReferenceStorage) UpdateCodeReference(ctx context.Context, codeRef *domain.CodeReference) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "UpdateCodeReference", ctx, codeRef)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// UpdateCodeReference indicates an expected call of UpdateCodeReference.
+func (mr *MockCodeReferenceStorageMockRecorder) UpdateCodeReference(ctx, codeRef any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCodeReference", reflect.TypeOf((*MockCodeReferenceStorage)(nil).UpdateCodeReference), ctx, codeRef)
+}
diff --git a/pkg/coderef/storage/sql/code_reference/count_code_references.sql b/pkg/coderef/storage/sql/code_reference/count_code_references.sql
new file mode 100644
index 0000000000..abaa73b4c0
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/count_code_references.sql
@@ -0,0 +1 @@
+SELECT COUNT(1) FROM code_reference
\ No newline at end of file
diff --git a/pkg/coderef/storage/sql/code_reference/delete_code_reference.sql b/pkg/coderef/storage/sql/code_reference/delete_code_reference.sql
new file mode 100644
index 0000000000..840610865f
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/delete_code_reference.sql
@@ -0,0 +1 @@
+DELETE FROM code_reference WHERE id = ?
\ No newline at end of file
diff --git a/pkg/coderef/storage/sql/code_reference/insert_code_reference.sql b/pkg/coderef/storage/sql/code_reference/insert_code_reference.sql
new file mode 100644
index 0000000000..28e99dc654
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/insert_code_reference.sql
@@ -0,0 +1,17 @@
+INSERT INTO code_reference (
+ id,
+ feature_id,
+ file_path,
+ line_number,
+ code_snippet,
+ content_hash,
+ aliases,
+ repository_name,
+ repository_owner,
+ repository_type,
+ repository_branch,
+ commit_hash,
+ environment_id,
+ created_at,
+ updated_at
+) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
\ No newline at end of file
diff --git a/pkg/coderef/storage/sql/code_reference/select_code_reference.sql b/pkg/coderef/storage/sql/code_reference/select_code_reference.sql
new file mode 100644
index 0000000000..6b3b8bed72
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/select_code_reference.sql
@@ -0,0 +1,20 @@
+SELECT
+ id,
+ feature_id,
+ file_path,
+ line_number,
+ code_snippet,
+ content_hash,
+ aliases,
+ repository_name,
+ repository_owner,
+ repository_type,
+ repository_branch,
+ commit_hash,
+ environment_id,
+ created_at,
+ updated_at
+FROM
+ code_reference
+WHERE
+ id = ?
\ No newline at end of file
diff --git a/pkg/coderef/storage/sql/code_reference/select_code_references.sql b/pkg/coderef/storage/sql/code_reference/select_code_references.sql
new file mode 100644
index 0000000000..85ff33920f
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/select_code_references.sql
@@ -0,0 +1,18 @@
+SELECT
+ id,
+ feature_id,
+ file_path,
+ line_number,
+ code_snippet,
+ content_hash,
+ aliases,
+ repository_name,
+ repository_owner,
+ repository_type,
+ repository_branch,
+ commit_hash,
+ environment_id,
+ created_at,
+ updated_at
+FROM
+ code_reference
\ No newline at end of file
diff --git a/pkg/coderef/storage/sql/code_reference/update_code_reference.sql b/pkg/coderef/storage/sql/code_reference/update_code_reference.sql
new file mode 100644
index 0000000000..78a9f813c9
--- /dev/null
+++ b/pkg/coderef/storage/sql/code_reference/update_code_reference.sql
@@ -0,0 +1,16 @@
+UPDATE code_reference
+SET
+ file_path = ?,
+ line_number = ?,
+ code_snippet = ?,
+ content_hash = ?,
+ aliases = ?,
+ repository_name = ?,
+ repository_owner = ?,
+ repository_type = ?,
+ repository_branch = ?,
+ commit_hash = ?,
+ updated_at = ?
+WHERE
+ id = ?
+ AND environment_id = ?
\ No newline at end of file
diff --git a/pkg/coderef/storage/storage.go b/pkg/coderef/storage/storage.go
new file mode 100644
index 0000000000..0f8df7babd
--- /dev/null
+++ b/pkg/coderef/storage/storage.go
@@ -0,0 +1,39 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:generate mockgen -source=$GOFILE -package=mock -destination=./mock/$GOFILE
+package storage
+
+import (
+ "context"
+
+ "github.com/bucketeer-io/bucketeer/pkg/coderef/domain"
+ "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
+)
+
+type CodeReferenceStorage interface {
+ RunInTransaction(ctx context.Context, f func() error) error
+ CreateCodeReference(ctx context.Context, codeRef *domain.CodeReference) error
+ UpdateCodeReference(ctx context.Context, codeRef *domain.CodeReference) error
+ GetCodeReference(ctx context.Context, id string) (*domain.CodeReference, error)
+ ListCodeReferences(
+ ctx context.Context,
+ whereParts []mysql.WherePart,
+ orders []*mysql.Order,
+ limit, offset int,
+ ) ([]*domain.CodeReference, int, int64, error)
+ DeleteCodeReference(ctx context.Context, id string) error
+}
+
+const transactionKey = "transaction"
diff --git a/pkg/domainevent/domain/message.go b/pkg/domainevent/domain/message.go
index 19a33c6009..77c625d262 100644
--- a/pkg/domainevent/domain/message.go
+++ b/pkg/domainevent/domain/message.go
@@ -370,6 +370,14 @@ func LocalizedMessage(eventType proto.Event_Type, localizer locale.Localizer) *p
localizer.MustLocalizeWithTemplate(locale.Goal),
),
}
+ case proto.Event_GOAL_UPDATED:
+ return &proto.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(
+ locale.UpdatedTemplate,
+ localizer.MustLocalizeWithTemplate(locale.Goal),
+ ),
+ }
case proto.Event_EXPERIMENT_CREATED:
return &proto.LocalizedMessage{
Locale: localizer.GetLocale(),
@@ -1396,6 +1404,30 @@ func LocalizedMessage(eventType proto.Event_Type, localizer locale.Localizer) *p
localizer.MustLocalizeWithTemplate(locale.Tag),
),
}
+ case proto.Event_CODE_REFERENCE_CREATED:
+ return &proto.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(
+ locale.CreatedTemplate,
+ localizer.MustLocalizeWithTemplate(locale.CodeReference),
+ ),
+ }
+ case proto.Event_CODE_REFERENCE_UPDATED:
+ return &proto.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(
+ locale.UpdatedTemplate,
+ localizer.MustLocalizeWithTemplate(locale.CodeReference),
+ ),
+ }
+ case proto.Event_CODE_REFERENCE_DELETED:
+ return &proto.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(
+ locale.DeletedTemplate,
+ localizer.MustLocalizeWithTemplate(locale.CodeReference),
+ ),
+ }
}
return &proto.LocalizedMessage{
Locale: localizer.GetLocale(),
diff --git a/pkg/domainevent/domain/url.go b/pkg/domainevent/domain/url.go
index 446a5806fe..2f10db87aa 100644
--- a/pkg/domainevent/domain/url.go
+++ b/pkg/domainevent/domain/url.go
@@ -22,6 +22,7 @@ import (
)
const (
+ urlTemplateCodeRef = "%s/%s/coderefs/%s"
urlTemplateFeature = "%s/%s/features/%s"
urlTemplateGoal = "%s/%s/goals/%s"
urlTemplateExperiment = "%s/%s/experiments/%s"
@@ -78,6 +79,8 @@ func URL(entityType proto.Event_EntityType, url, envURLCode, id string) (string,
return fmt.Sprintf(urlTemplateFeature, url, envURLCode, id), nil
case proto.Event_TAG:
return fmt.Sprintf(urlTemplateTag, url, envURLCode, id), nil
+ case proto.Event_CODEREF:
+ return fmt.Sprintf(urlTemplateCodeRef, url, envURLCode, id), nil
}
return "", ErrUnknownEntityType
}
diff --git a/pkg/experiment/api/api.go b/pkg/experiment/api/api.go
index 61807796d4..8148550f17 100644
--- a/pkg/experiment/api/api.go
+++ b/pkg/experiment/api/api.go
@@ -24,6 +24,7 @@ import (
"google.golang.org/grpc/status"
accountclient "github.com/bucketeer-io/bucketeer/pkg/account/client"
+ autoopsclient "github.com/bucketeer-io/bucketeer/pkg/autoops/client"
featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client"
"github.com/bucketeer-io/bucketeer/pkg/locale"
"github.com/bucketeer-io/bucketeer/pkg/log"
@@ -51,6 +52,7 @@ func WithLogger(l *zap.Logger) Option {
type experimentService struct {
featureClient featureclient.Client
accountClient accountclient.Client
+ autoOpsClient autoopsclient.Client
mysqlClient mysql.Client
publisher publisher.Publisher
opts *options
@@ -60,6 +62,7 @@ type experimentService struct {
func NewExperimentService(
featureClient featureclient.Client,
accountClient accountclient.Client,
+ autoOpsClient autoopsclient.Client,
mysqlClient mysql.Client,
publisher publisher.Publisher,
opts ...Option,
@@ -73,6 +76,7 @@ func NewExperimentService(
return &experimentService{
featureClient: featureClient,
accountClient: accountClient,
+ autoOpsClient: autoOpsClient,
mysqlClient: mysqlClient,
publisher: publisher,
opts: dopts,
diff --git a/pkg/experiment/api/api_test.go b/pkg/experiment/api/api_test.go
index 5a0b8ca886..6f1cdc4a3b 100644
--- a/pkg/experiment/api/api_test.go
+++ b/pkg/experiment/api/api_test.go
@@ -25,6 +25,7 @@ import (
md "google.golang.org/grpc/metadata"
accountclientmock "github.com/bucketeer-io/bucketeer/pkg/account/client/mock"
+ autoopsclientmock "github.com/bucketeer-io/bucketeer/pkg/autoops/client/mock"
featureclientmock "github.com/bucketeer-io/bucketeer/pkg/feature/client/mock"
publishermock "github.com/bucketeer-io/bucketeer/pkg/pubsub/publisher/mock"
"github.com/bucketeer-io/bucketeer/pkg/rpc"
@@ -40,12 +41,14 @@ func TestNewExperimentService(t *testing.T) {
defer mockController.Finish()
featureClientMock := featureclientmock.NewMockClient(mockController)
accountClientMock := accountclientmock.NewMockClient(mockController)
+ autoOpsClientMock := autoopsclientmock.NewMockClient(mockController)
mysqlClient := mysqlmock.NewMockClient(mockController)
p := publishermock.NewMockPublisher(mockController)
logger := zap.NewNop()
s := NewExperimentService(
featureClientMock,
accountClientMock,
+ autoOpsClientMock,
mysqlClient,
p,
WithLogger(logger),
@@ -104,10 +107,11 @@ func createExperimentService(c *gomock.Controller, specifiedEnvironmentId *strin
},
}
accountClientMock.EXPECT().GetAccountV2ByEnvironmentID(gomock.Any(), gomock.Any()).Return(ar, nil).AnyTimes()
+ autoOpsClientMock := autoopsclientmock.NewMockClient(c)
mysqlClient := mysqlmock.NewMockClient(c)
p := publishermock.NewMockPublisher(c)
p.EXPECT().Publish(gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
- es := NewExperimentService(featureClientMock, accountClientMock, mysqlClient, p)
+ es := NewExperimentService(featureClientMock, accountClientMock, autoOpsClientMock, mysqlClient, p)
return es.(*experimentService)
}
diff --git a/pkg/experiment/api/error.go b/pkg/experiment/api/error.go
index a0443ce9c7..b559009a8f 100644
--- a/pkg/experiment/api/error.go
+++ b/pkg/experiment/api/error.go
@@ -20,20 +20,21 @@ import (
)
var (
- statusInternal = gstatus.New(codes.Internal, "experiment: internal")
- statusInvalidCursor = gstatus.New(codes.InvalidArgument, "experiment: cursor is invalid")
- statusNoCommand = gstatus.New(codes.InvalidArgument, "experiment: must contain at least one command")
- statusFeatureIDRequired = gstatus.New(codes.InvalidArgument, "experiment: feature id must be specified")
- statusExperimentIDRequired = gstatus.New(codes.InvalidArgument, "experiment: experiment id must be specified")
- statusGoalIDRequired = gstatus.New(codes.InvalidArgument, "experiment: goal id must be specified")
- statusInvalidGoalID = gstatus.New(codes.InvalidArgument, "experiment: invalid goal id")
- statusGoalNameRequired = gstatus.New(codes.InvalidArgument, "experiment: goal name must be specified")
- statusPeriodTooLong = gstatus.New(codes.InvalidArgument, "experiment: period too long")
- statusInvalidOrderBy = gstatus.New(codes.InvalidArgument, "expriment: order_by is invalid")
- statusNotFound = gstatus.New(codes.NotFound, "experiment: not found")
- statusGoalNotFound = gstatus.New(codes.NotFound, "experiment: goal not found")
- statusFeatureNotFound = gstatus.New(codes.NotFound, "experiment: feature not found")
- statusAlreadyExists = gstatus.New(codes.AlreadyExists, "experiment: already exists")
- statusUnauthenticated = gstatus.New(codes.Unauthenticated, "experiment: unauthenticated")
- statusPermissionDenied = gstatus.New(codes.PermissionDenied, "experiment: permission denied")
+ statusInternal = gstatus.New(codes.Internal, "experiment: internal")
+ statusInvalidCursor = gstatus.New(codes.InvalidArgument, "experiment: cursor is invalid")
+ statusNoCommand = gstatus.New(codes.InvalidArgument, "experiment: must contain at least one command")
+ statusFeatureIDRequired = gstatus.New(codes.InvalidArgument, "experiment: feature id must be specified")
+ statusExperimentIDRequired = gstatus.New(codes.InvalidArgument, "experiment: experiment id must be specified")
+ statusExperimentNameRequired = gstatus.New(codes.InvalidArgument, "experiment: experiment name must be specified")
+ statusGoalIDRequired = gstatus.New(codes.InvalidArgument, "experiment: goal id must be specified")
+ statusInvalidGoalID = gstatus.New(codes.InvalidArgument, "experiment: invalid goal id")
+ statusGoalNameRequired = gstatus.New(codes.InvalidArgument, "experiment: goal name must be specified")
+ statusPeriodTooLong = gstatus.New(codes.InvalidArgument, "experiment: period too long")
+ statusInvalidOrderBy = gstatus.New(codes.InvalidArgument, "expriment: order_by is invalid")
+ statusNotFound = gstatus.New(codes.NotFound, "experiment: not found")
+ statusGoalNotFound = gstatus.New(codes.NotFound, "experiment: goal not found")
+ statusFeatureNotFound = gstatus.New(codes.NotFound, "experiment: feature not found")
+ statusAlreadyExists = gstatus.New(codes.AlreadyExists, "experiment: already exists")
+ statusUnauthenticated = gstatus.New(codes.Unauthenticated, "experiment: unauthenticated")
+ statusPermissionDenied = gstatus.New(codes.PermissionDenied, "experiment: permission denied")
)
diff --git a/pkg/experiment/api/experiment.go b/pkg/experiment/api/experiment.go
index 93bf5aece9..e12e2c478e 100644
--- a/pkg/experiment/api/experiment.go
+++ b/pkg/experiment/api/experiment.go
@@ -16,13 +16,16 @@ package api
import (
"context"
+ "errors"
"strconv"
+ "github.com/jinzhu/copier"
"go.uber.org/zap"
"google.golang.org/genproto/googleapis/rpc/errdetails"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
+ domainevent "github.com/bucketeer-io/bucketeer/pkg/domainevent/domain"
"github.com/bucketeer-io/bucketeer/pkg/experiment/command"
"github.com/bucketeer-io/bucketeer/pkg/experiment/domain"
v2es "github.com/bucketeer-io/bucketeer/pkg/experiment/storage/v2"
@@ -57,7 +60,7 @@ func (s *experimentService) GetExperiment(
experimentStorage := v2es.NewExperimentStorage(s.mysqlClient)
experiment, err := experimentStorage.GetExperiment(ctx, req.Id, req.EnvironmentId)
if err != nil {
- if err == v2es.ErrExperimentNotFound {
+ if errors.Is(err, v2es.ErrExperimentNotFound) {
dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
Message: localizer.MustLocalize(locale.NotFoundError),
@@ -165,7 +168,7 @@ func (s *experimentService) ListExperiments(
return nil, dt.Err()
}
experimentStorage := v2es.NewExperimentStorage(s.mysqlClient)
- experiments, nextCursor, totalCount, err := experimentStorage.ListExperiments(
+ experiments, nextCursor, totalCount, summary, err := experimentStorage.ListExperiments(
ctx,
whereParts,
orders,
@@ -193,6 +196,7 @@ func (s *experimentService) ListExperiments(
Experiments: experiments,
Cursor: strconv.Itoa(nextCursor),
TotalCount: totalCount,
+ Summary: summary,
}, nil
}
@@ -205,11 +209,11 @@ func (s *experimentService) newExperimentListOrders(
switch orderBy {
case proto.ListExperimentsRequest_DEFAULT,
proto.ListExperimentsRequest_NAME:
- column = "name"
+ column = "ex.name"
case proto.ListExperimentsRequest_CREATED_AT:
- column = "created_at"
+ column = "ex.created_at"
case proto.ListExperimentsRequest_UPDATED_AT:
- column = "updated_at"
+ column = "ex.updated_at"
default:
dt, err := statusInvalidOrderBy.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
@@ -238,6 +242,9 @@ func (s *experimentService) CreateExperiment(
if err != nil {
return nil, err
}
+ if req.Command == nil {
+ return s.createExperimentNoCommand(ctx, req, editor, localizer)
+ }
if err := validateCreateExperimentRequest(req, localizer); err != nil {
return nil, err
}
@@ -275,7 +282,7 @@ func (s *experimentService) CreateExperiment(
for _, gid := range req.Command.GoalIds {
_, err := s.getGoalMySQL(ctx, gid, req.EnvironmentId)
if err != nil {
- if err == v2es.ErrGoalNotFound {
+ if errors.Is(err, v2es.ErrGoalNotFound) {
dt, err := statusGoalNotFound.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
Message: localizer.MustLocalize(locale.NotFoundError),
@@ -358,7 +365,7 @@ func (s *experimentService) CreateExperiment(
return experimentStorage.CreateExperiment(ctx, experiment, req.EnvironmentId)
})
if err != nil {
- if err == v2es.ErrExperimentAlreadyExists {
+ if errors.Is(err, v2es.ErrExperimentAlreadyExists) {
dt, err := statusAlreadyExists.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
Message: localizer.MustLocalize(locale.AlreadyExistsError),
@@ -389,17 +396,148 @@ func (s *experimentService) CreateExperiment(
}, nil
}
-func validateCreateExperimentRequest(req *proto.CreateExperimentRequest, localizer locale.Localizer) error {
- if req.Command == nil {
- dt, err := statusNoCommand.WithDetails(&errdetails.LocalizedMessage{
+func (s *experimentService) createExperimentNoCommand(
+ ctx context.Context,
+ req *proto.CreateExperimentRequest,
+ editor *eventproto.Editor,
+ localizer locale.Localizer,
+) (*proto.CreateExperimentResponse, error) {
+ err := validateCreateExperimentRequestNoCommand(req, localizer)
+ if err != nil {
+ return nil, err
+ }
+ getFeatureResp, err := s.featureClient.GetFeature(ctx, &featureproto.GetFeatureRequest{
+ Id: req.FeatureId,
+ EnvironmentId: req.EnvironmentId,
+ })
+ if err != nil {
+ if code := status.Code(err); code == codes.NotFound {
+ dt, err := statusFeatureNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ s.logger.Error(
+ "Failed to get feature",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
- Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "command"),
+ Message: localizer.MustLocalize(locale.InternalServerError),
})
if err != nil {
- return statusInternal.Err()
+ return nil, statusInternal.Err()
}
- return dt.Err()
+ return nil, dt.Err()
+ }
+ experiment, err := domain.NewExperiment(
+ req.FeatureId,
+ getFeatureResp.Feature.Version,
+ getFeatureResp.Feature.Variations,
+ req.GoalIds,
+ req.StartAt,
+ req.StopAt,
+ req.Name,
+ req.Description,
+ req.BaseVariationId,
+ editor.Email,
+ )
+ if err != nil {
+ s.logger.Error(
+ "Failed to create a new experiment",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(ctxWithTx context.Context, tx mysql.Transaction) error {
+ experimentStorage := v2es.NewExperimentStorage(s.mysqlClient)
+ prev := &domain.Experiment{}
+ if err = copier.Copy(prev, experiment); err != nil {
+ return err
+ }
+ e, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_EXPERIMENT,
+ experiment.Id,
+ eventproto.Event_EXPERIMENT_CREATED,
+ &eventproto.ExperimentCreatedEvent{
+ Id: experiment.Id,
+ FeatureId: experiment.FeatureId,
+ FeatureVersion: experiment.FeatureVersion,
+ Variations: experiment.Variations,
+ GoalIds: experiment.GoalIds,
+ StartAt: experiment.StartAt,
+ StopAt: experiment.StopAt,
+ StoppedAt: experiment.StoppedAt,
+ CreatedAt: experiment.CreatedAt,
+ UpdatedAt: experiment.UpdatedAt,
+ Name: experiment.Name,
+ Description: experiment.Description,
+ BaseVariationId: experiment.BaseVariationId,
+ },
+ req.EnvironmentId,
+ experiment.Experiment,
+ prev,
+ )
+ if err != nil {
+ return err
+ }
+ err = s.publisher.Publish(ctx, e)
+ if err != nil {
+ return err
+ }
+ return experimentStorage.CreateExperiment(ctxWithTx, experiment, req.EnvironmentId)
+ })
+ if err != nil {
+ if errors.Is(err, v2es.ErrExperimentAlreadyExists) {
+ dt, err := statusAlreadyExists.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.AlreadyExistsError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ s.logger.Error(
+ "Failed to create experiment",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ zap.String("environmentId", req.EnvironmentId),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
}
+ return &proto.CreateExperimentResponse{
+ Experiment: experiment.Experiment,
+ }, nil
+}
+
+func validateCreateExperimentRequest(req *proto.CreateExperimentRequest, localizer locale.Localizer) error {
if req.Command.FeatureId == "" {
dt, err := statusFeatureIDRequired.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
@@ -439,6 +577,58 @@ func validateCreateExperimentRequest(req *proto.CreateExperimentRequest, localiz
return nil
}
+func validateCreateExperimentRequestNoCommand(
+ req *proto.CreateExperimentRequest,
+ localizer locale.Localizer,
+) error {
+ if req.FeatureId == "" {
+ dt, err := statusFeatureIDRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "feature_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if len(req.GoalIds) == 0 {
+ dt, err := statusGoalIDRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ for _, gid := range req.GoalIds {
+ if gid == "" {
+ dt, err := statusGoalIDRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ }
+ if err := validateExperimentPeriod(req.StartAt, req.StopAt, localizer); err != nil {
+ return err
+ }
+ if req.Name == "" {
+ dt, err := statusExperimentNameRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "name"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
func validateExperimentPeriod(startAt, stopAt int64, localizer locale.Localizer) error {
period := stopAt - startAt
if period <= 0 || period > int64(maxExperimentPeriod) {
diff --git a/pkg/experiment/api/experiment_test.go b/pkg/experiment/api/experiment_test.go
index 54a5a29e70..e5a3d2e84e 100644
--- a/pkg/experiment/api/experiment_test.go
+++ b/pkg/experiment/api/experiment_test.go
@@ -26,12 +26,11 @@ import (
"google.golang.org/grpc/metadata"
gstatus "google.golang.org/grpc/status"
- accountproto "github.com/bucketeer-io/bucketeer/proto/account"
-
v2es "github.com/bucketeer-io/bucketeer/pkg/experiment/storage/v2"
"github.com/bucketeer-io/bucketeer/pkg/locale"
"github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
mysqlmock "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql/mock"
+ accountproto "github.com/bucketeer-io/bucketeer/proto/account"
experimentproto "github.com/bucketeer-io/bucketeer/proto/experiment"
)
@@ -214,6 +213,106 @@ func TestCreateExperimentMySQL(t *testing.T) {
}
}
+func TestCreateExperimentNoCommandMySQL(t *testing.T) {
+ t.Parallel()
+ mockController := gomock.NewController(t)
+ defer mockController.Finish()
+
+ ctx := createContextWithToken()
+ ctx = metadata.NewIncomingContext(ctx, metadata.MD{
+ "accept-language": []string{"ja"},
+ })
+ localizer := locale.NewLocalizer(ctx)
+ createError := func(status *gstatus.Status, msg string) error {
+ st, err := status.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: msg,
+ })
+ require.NoError(t, err)
+ return st.Err()
+ }
+
+ patterns := []struct {
+ desc string
+ setup func(s *experimentService)
+ input *experimentproto.CreateExperimentRequest
+ expectedErr error
+ }{
+ {
+ desc: "missing feature id",
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "",
+ GoalIds: []string{"gid"},
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusFeatureIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "feature_id")),
+ },
+ {
+ desc: "missing goal id",
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "fid",
+ GoalIds: nil,
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
+ },
+ {
+ desc: "empty goal id",
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "fid",
+ GoalIds: []string{""},
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
+ },
+ {
+ desc: "empty goal id",
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "fid",
+ GoalIds: []string{"gid", ""},
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
+ },
+ {
+ desc: "period too long",
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "fid",
+ GoalIds: []string{"gid0", "gid1"},
+ StartAt: 1,
+ StopAt: 30*24*60*60 + 2,
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusPeriodTooLong, localizer.MustLocalizeWithTemplate(locale.InvalidArgumentError, "period")),
+ },
+ {
+ desc: "success",
+ setup: func(s *experimentService) {
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
+ ).Return(nil)
+ },
+ input: &experimentproto.CreateExperimentRequest{
+ FeatureId: "fid",
+ GoalIds: []string{"goalId"},
+ Name: "exp0",
+ StartAt: 1,
+ StopAt: 10,
+ EnvironmentId: "ns0",
+ },
+ expectedErr: nil,
+ },
+ }
+ for _, p := range patterns {
+ service := createExperimentService(mockController, nil, nil, nil)
+ if p.setup != nil {
+ p.setup(service)
+ }
+ _, err := service.CreateExperiment(ctx, p.input)
+ assert.Equal(t, p.expectedErr, err)
+ }
+}
+
func TestValidateCreateExperimentRequest(t *testing.T) {
t.Parallel()
ctx := context.TODO()
diff --git a/pkg/experiment/api/goal.go b/pkg/experiment/api/goal.go
index 0e435dc27e..38c3804db5 100644
--- a/pkg/experiment/api/goal.go
+++ b/pkg/experiment/api/goal.go
@@ -20,6 +20,7 @@ import (
"regexp"
"strconv"
+ pb "github.com/golang/protobuf/proto"
"go.uber.org/zap"
"google.golang.org/genproto/googleapis/rpc/errdetails"
@@ -31,6 +32,7 @@ import (
"github.com/bucketeer-io/bucketeer/pkg/log"
"github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
accountproto "github.com/bucketeer-io/bucketeer/proto/account"
+ autoopsproto "github.com/bucketeer-io/bucketeer/proto/autoops"
eventproto "github.com/bucketeer-io/bucketeer/proto/event/domain"
proto "github.com/bucketeer-io/bucketeer/proto/experiment"
)
@@ -76,6 +78,18 @@ func (s *experimentService) GetGoal(ctx context.Context, req *proto.GetGoalReque
}
return nil, dt.Err()
}
+ err = s.mapConnectedOperations(ctx, []*proto.Goal{goal.Goal}, req.EnvironmentId)
+ if err != nil {
+ s.logger.Error("Failed to map connected operations", zap.Error(err))
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
return &proto.GetGoalResponse{Goal: goal.Goal}, nil
}
@@ -174,6 +188,19 @@ func (s *experimentService) ListGoals(
}
return nil, dt.Err()
}
+ err = s.mapConnectedOperations(ctx, goals, req.EnvironmentId)
+ if err != nil {
+ s.logger.Error("Failed to map connected operations", zap.Error(err))
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+
return &proto.ListGoalsResponse{
Goals: goals,
Cursor: strconv.Itoa(nextCursor),
@@ -195,6 +222,8 @@ func (s *experimentService) newGoalListOrders(
column = "created_at"
case proto.ListGoalsRequest_UPDATED_AT:
column = "updated_at"
+ case proto.ListGoalsRequest_CONNECTION_TYPE:
+ column = "connection_type"
default:
dt, err := statusInvalidOrderBy.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
@@ -212,6 +241,41 @@ func (s *experimentService) newGoalListOrders(
return []*mysql.Order{mysql.NewOrder(column, direction)}, nil
}
+func (s *experimentService) mapConnectedOperations(
+ ctx context.Context,
+ goals []*proto.Goal,
+ environmentID string,
+) error {
+ listAutoOpRulesResp, err := s.autoOpsClient.ListAutoOpsRules(ctx, &autoopsproto.ListAutoOpsRulesRequest{
+ EnvironmentId: environmentID,
+ })
+ if err != nil {
+ return err
+ }
+ autoOpsRules := listAutoOpRulesResp.AutoOpsRules
+ goalOpsMap := make(map[string][]*autoopsproto.AutoOpsRule)
+ for _, rule := range autoOpsRules {
+ for _, clause := range rule.Clauses {
+ if clause.Clause.MessageIs(&autoopsproto.OpsEventRateClause{}) {
+ c := &autoopsproto.OpsEventRateClause{}
+ if err := clause.Clause.UnmarshalTo(c); err != nil {
+ return err
+ }
+ if c.GoalId == "" {
+ continue
+ }
+ goalOpsMap[c.GoalId] = append(goalOpsMap[c.GoalId], rule)
+ }
+ }
+ }
+ for _, goal := range goals {
+ if ops, ok := goalOpsMap[goal.Id]; ok {
+ goal.AutoOpsRules = ops
+ }
+ }
+ return nil
+}
+
func (s *experimentService) CreateGoal(
ctx context.Context,
req *proto.CreateGoalRequest,
@@ -229,7 +293,7 @@ func (s *experimentService) CreateGoal(
if err := validateCreateGoalRequest(req, localizer); err != nil {
return nil, err
}
- goal, err := domain.NewGoal(req.Command.Id, req.Command.Name, req.Command.Description)
+ goal, err := domain.NewGoal(req.Command.Id, req.Command.Name, req.Command.Description, req.Command.ConnectionType)
if err != nil {
s.logger.Error(
"Failed to create a new goal",
@@ -316,7 +380,7 @@ func (s *experimentService) createGoalNoCommand(
if err := validateCreateGoalNoCommandRequest(req, localizer); err != nil {
return nil, err
}
- goal, err := domain.NewGoal(req.Id, req.Name, req.Description)
+ goal, err := domain.NewGoal(req.Id, req.Name, req.Description, req.ConnectionType)
if err != nil {
s.logger.Error(
"Failed to create a new goal",
@@ -360,12 +424,13 @@ func (s *experimentService) createGoalNoCommand(
goal.Id,
eventproto.Event_GOAL_CREATED,
&eventproto.GoalCreatedEvent{
- Id: goal.Id,
- Name: goal.Name,
- Description: goal.Description,
- Deleted: goal.Deleted,
- CreatedAt: goal.CreatedAt,
- UpdatedAt: goal.UpdatedAt,
+ Id: goal.Id,
+ Name: goal.Name,
+ Description: goal.Description,
+ ConnectionType: goal.ConnectionType,
+ Deleted: goal.Deleted,
+ CreatedAt: goal.CreatedAt,
+ UpdatedAt: goal.UpdatedAt,
},
req.EnvironmentId,
goal.Goal,
@@ -490,6 +555,9 @@ func (s *experimentService) UpdateGoal(
if err != nil {
return nil, err
}
+ if req.ChangeDescriptionCommand == nil && req.RenameCommand == nil {
+ return s.updateGoalNoCommand(ctx, req, editor, localizer)
+ }
if req.Id == "" {
dt, err := statusGoalIDRequired.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
@@ -538,6 +606,131 @@ func (s *experimentService) UpdateGoal(
return &proto.UpdateGoalResponse{}, nil
}
+func (s *experimentService) updateGoalNoCommand(
+ ctx context.Context,
+ req *proto.UpdateGoalRequest,
+ editor *eventproto.Editor,
+ localizer locale.Localizer,
+) (*proto.UpdateGoalResponse, error) {
+ err := s.validateUpdateGoalNoCommandRequest(req, localizer)
+ if err != nil {
+ return nil, err
+ }
+
+ tx, err := s.mysqlClient.BeginTx(ctx)
+ if err != nil {
+ s.logger.Error(
+ "Failed to begin transaction",
+ log.FieldsFromImcomingContext(ctx).AddFields(
+ zap.Error(err),
+ )...,
+ )
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ var updatedGoal *proto.Goal
+ err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
+ goalStorage := v2es.NewGoalStorage(tx)
+ goal, err := goalStorage.GetGoal(ctx, req.Id, req.EnvironmentId)
+ if err != nil {
+ return err
+ }
+ updated, err := goal.Update(
+ req.Name,
+ req.Description,
+ req.Archived,
+ )
+ if err != nil {
+ return err
+ }
+ updatedGoal = updated.Goal
+
+ var event pb.Message
+ if req.Archived != nil && req.Archived.Value {
+ event = &eventproto.GoalArchivedEvent{Id: goal.Id}
+ } else {
+ event = &eventproto.GoalUpdatedEvent{
+ Id: goal.Id,
+ Name: req.Name,
+ Description: req.Description,
+ }
+ }
+ e, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_GOAL,
+ goal.Id,
+ eventproto.Event_GOAL_UPDATED,
+ event,
+ req.EnvironmentId,
+ updated.Goal,
+ goal.Goal,
+ )
+ if err != nil {
+ return err
+ }
+ if err = s.publisher.Publish(ctx, e); err != nil {
+ return err
+ }
+ return goalStorage.UpdateGoal(ctx, updated, req.EnvironmentId)
+ })
+ if err != nil {
+ if errors.Is(err, v2es.ErrGoalNotFound) || errors.Is(err, v2es.ErrGoalUnexpectedAffectedRows) {
+ dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.InternalServerError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ return &proto.UpdateGoalResponse{
+ Goal: updatedGoal,
+ }, nil
+}
+
+func (s *experimentService) validateUpdateGoalNoCommandRequest(
+ req *proto.UpdateGoalRequest,
+ localizer locale.Localizer,
+) error {
+ if req.Id == "" {
+ dt, err := statusGoalIDRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ if req.Name != nil && req.Name.Value == "" {
+ dt, err := statusGoalNameRequired.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "name"),
+ })
+ if err != nil {
+ return statusInternal.Err()
+ }
+ return dt.Err()
+ }
+ return nil
+}
+
func (s *experimentService) ArchiveGoal(
ctx context.Context,
req *proto.ArchiveGoalRequest,
@@ -611,34 +804,52 @@ func (s *experimentService) DeleteGoal(
}
return nil, dt.Err()
}
- if req.Command == nil {
- dt, err := statusNoCommand.WithDetails(&errdetails.LocalizedMessage{
+ err = s.mysqlClient.RunInTransactionV2(ctx, func(ctxWithTx context.Context, tx mysql.Transaction) error {
+ experimentStorage := v2es.NewGoalStorage(s.mysqlClient)
+ goal, err := experimentStorage.GetGoal(ctxWithTx, req.Id, req.EnvironmentId)
+ if err != nil {
+ return err
+ }
+ e, err := domainevent.NewEvent(
+ editor,
+ eventproto.Event_GOAL,
+ goal.Id,
+ eventproto.Event_GOAL_DELETED,
+ &eventproto.GoalDeletedEvent{
+ Id: goal.Id,
+ },
+ req.EnvironmentId,
+ goal.Goal,
+ &domain.Goal{},
+ )
+ if err != nil {
+ return err
+ }
+ if err := s.publisher.Publish(ctxWithTx, e); err != nil {
+ return err
+ }
+ return experimentStorage.DeleteGoal(ctxWithTx, req.Id, req.EnvironmentId)
+ })
+ if err != nil {
+ if errors.Is(err, v2es.ErrGoalNotFound) || errors.Is(err, v2es.ErrGoalUnexpectedAffectedRows) {
+ dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: localizer.MustLocalize(locale.NotFoundError),
+ })
+ if err != nil {
+ return nil, statusInternal.Err()
+ }
+ return nil, dt.Err()
+ }
+ dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
- Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "command"),
+ Message: localizer.MustLocalize(locale.InternalServerError),
})
if err != nil {
return nil, statusInternal.Err()
}
return nil, dt.Err()
}
- err = s.updateGoal(
- ctx,
- editor,
- req.EnvironmentId,
- req.Id,
- []command.Command{req.Command},
- localizer,
- )
- if err != nil {
- s.logger.Error(
- "Failed to delete goal",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- zap.String("environmentId", req.EnvironmentId),
- )...,
- )
- return nil, err
- }
return &proto.DeleteGoalResponse{}, nil
}
@@ -684,7 +895,7 @@ func (s *experimentService) updateGoal(
return goalStorage.UpdateGoal(ctx, goal, environmentId)
})
if err != nil {
- if err == v2es.ErrGoalNotFound || err == v2es.ErrGoalUnexpectedAffectedRows {
+ if errors.Is(err, v2es.ErrGoalNotFound) || errors.Is(err, v2es.ErrGoalUnexpectedAffectedRows) {
dt, err := statusNotFound.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
Message: localizer.MustLocalize(locale.NotFoundError),
diff --git a/pkg/experiment/api/goal_test.go b/pkg/experiment/api/goal_test.go
index d659a1d760..5b981f09a4 100644
--- a/pkg/experiment/api/goal_test.go
+++ b/pkg/experiment/api/goal_test.go
@@ -24,13 +24,15 @@ import (
"google.golang.org/genproto/googleapis/rpc/errdetails"
"google.golang.org/grpc/metadata"
gstatus "google.golang.org/grpc/status"
+ "google.golang.org/protobuf/types/known/wrapperspb"
- accountproto "github.com/bucketeer-io/bucketeer/proto/account"
-
+ autoopsclientmock "github.com/bucketeer-io/bucketeer/pkg/autoops/client/mock"
v2es "github.com/bucketeer-io/bucketeer/pkg/experiment/storage/v2"
"github.com/bucketeer-io/bucketeer/pkg/locale"
"github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql"
mysqlmock "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql/mock"
+ accountproto "github.com/bucketeer-io/bucketeer/proto/account"
+ autoopsproto "github.com/bucketeer-io/bucketeer/proto/autoops"
experimentproto "github.com/bucketeer-io/bucketeer/proto/experiment"
)
@@ -100,6 +102,11 @@ func TestGetGoalMySQL(t *testing.T) {
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
+ s.autoOpsClient.(*autoopsclientmock.MockClient).EXPECT().ListAutoOpsRules(
+ gomock.Any(), gomock.Any(),
+ ).Return(&autoopsproto.ListAutoOpsRulesResponse{
+ AutoOpsRules: []*autoopsproto.AutoOpsRule{},
+ }, nil)
},
id: "id-1",
environmentId: "ns0",
@@ -170,6 +177,11 @@ func TestListGoalMySQL(t *testing.T) {
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().QueryRowContext(
gomock.Any(), gomock.Any(), gomock.Any(),
).Return(row)
+ s.autoOpsClient.(*autoopsclientmock.MockClient).EXPECT().ListAutoOpsRules(
+ gomock.Any(), gomock.Any(),
+ ).Return(&autoopsproto.ListAutoOpsRulesResponse{
+ AutoOpsRules: []*autoopsproto.AutoOpsRule{},
+ }, nil)
},
req: &experimentproto.ListGoalsRequest{EnvironmentId: "ns0"},
expectedErr: nil,
@@ -397,14 +409,88 @@ func TestUpdateGoalMySQL(t *testing.T) {
expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
},
{
+ setup: func(s *experimentService) {
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
+ gomock.Any(), gomock.Any(), gomock.Any(),
+ ).Return(v2es.ErrGoalNotFound)
+ },
+ req: &experimentproto.UpdateGoalRequest{
+ Id: "id-0",
+ RenameCommand: &experimentproto.RenameGoalCommand{Name: "name-0"},
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusNotFound, localizer.MustLocalize(locale.NotFoundError)),
+ },
+ {
+ setup: func(s *experimentService) {
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
+ gomock.Any(), gomock.Any(), gomock.Any(),
+ ).Return(nil)
+ },
+ req: &experimentproto.UpdateGoalRequest{
+ Id: "id-1",
+ RenameCommand: &experimentproto.RenameGoalCommand{Name: "name-1"},
+ EnvironmentId: "ns0",
+ },
+ expectedErr: nil,
+ },
+ }
+ for _, p := range patterns {
+ service := createExperimentService(mockController, nil, nil, nil)
+ if p.setup != nil {
+ p.setup(service)
+ }
+ _, err := service.UpdateGoal(ctx, p.req)
+ assert.Equal(t, p.expectedErr, err)
+ }
+}
+
+func TestUpdateGoalNoCommandMySQL(t *testing.T) {
+ t.Parallel()
+ mockController := gomock.NewController(t)
+ defer mockController.Finish()
+
+ ctx := createContextWithTokenAndMetadata(metadata.MD{
+ "accept-language": []string{"ja"},
+ })
+ localizer := locale.NewLocalizer(ctx)
+ createError := func(status *gstatus.Status, msg string) error {
+ st, err := status.WithDetails(&errdetails.LocalizedMessage{
+ Locale: localizer.GetLocale(),
+ Message: msg,
+ })
+ require.NoError(t, err)
+ return st.Err()
+ }
+
+ patterns := []struct {
+ desc string
+ setup func(*experimentService)
+ req *experimentproto.UpdateGoalRequest
+ expectedErr error
+ }{
+ {
+ desc: "error: missing Id",
+ setup: nil,
+ req: &experimentproto.UpdateGoalRequest{
+ EnvironmentId: "ns0",
+ },
+ expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
+ },
+ {
+ desc: "error: name empty",
setup: nil,
req: &experimentproto.UpdateGoalRequest{
Id: "id-0",
+ Name: wrapperspb.String(""),
EnvironmentId: "ns0",
},
- expectedErr: createError(statusNoCommand, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "command")),
+ expectedErr: createError(statusGoalNameRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "name")),
},
{
+ desc: "error: not found",
setup: func(s *experimentService) {
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
@@ -413,12 +499,13 @@ func TestUpdateGoalMySQL(t *testing.T) {
},
req: &experimentproto.UpdateGoalRequest{
Id: "id-0",
- RenameCommand: &experimentproto.RenameGoalCommand{Name: "name-0"},
+ Name: wrapperspb.String("name-0"),
EnvironmentId: "ns0",
},
expectedErr: createError(statusNotFound, localizer.MustLocalize(locale.NotFoundError)),
},
{
+ desc: "success",
setup: func(s *experimentService) {
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
@@ -427,7 +514,23 @@ func TestUpdateGoalMySQL(t *testing.T) {
},
req: &experimentproto.UpdateGoalRequest{
Id: "id-1",
- RenameCommand: &experimentproto.RenameGoalCommand{Name: "name-1"},
+ Name: wrapperspb.String("name-0"),
+ Description: wrapperspb.String("description-0"),
+ EnvironmentId: "ns0",
+ },
+ expectedErr: nil,
+ },
+ {
+ desc: "success: archived goal",
+ setup: func(s *experimentService) {
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
+ gomock.Any(), gomock.Any(), gomock.Any(),
+ ).Return(nil)
+ },
+ req: &experimentproto.UpdateGoalRequest{
+ Id: "id-1",
+ Archived: wrapperspb.Bool(true),
EnvironmentId: "ns0",
},
expectedErr: nil,
@@ -550,38 +653,26 @@ func TestDeleteGoalMySQL(t *testing.T) {
},
expectedErr: createError(statusGoalIDRequired, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "goal_id")),
},
- {
- setup: nil,
- req: &experimentproto.DeleteGoalRequest{
- Id: "id-0",
- EnvironmentId: "ns0",
- },
- expectedErr: createError(statusNoCommand, localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "command")),
- },
{
setup: func(s *experimentService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2es.ErrGoalNotFound)
},
req: &experimentproto.DeleteGoalRequest{
Id: "id-0",
- Command: &experimentproto.DeleteGoalCommand{},
EnvironmentId: "ns0",
},
expectedErr: createError(statusNotFound, localizer.MustLocalize(locale.NotFoundError)),
},
{
setup: func(s *experimentService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
},
req: &experimentproto.DeleteGoalRequest{
Id: "id-1",
- Command: &experimentproto.DeleteGoalCommand{},
EnvironmentId: "ns0",
},
expectedErr: nil,
diff --git a/pkg/experiment/command/goal.go b/pkg/experiment/command/goal.go
index afc8e54a07..e404fcb806 100644
--- a/pkg/experiment/command/goal.go
+++ b/pkg/experiment/command/goal.go
@@ -73,12 +73,13 @@ func (h *goalCommandHandler) Handle(ctx context.Context, cmd Command) error {
func (h *goalCommandHandler) create(ctx context.Context, cmd *proto.CreateGoalCommand) error {
return h.send(ctx, eventproto.Event_GOAL_CREATED, &eventproto.GoalCreatedEvent{
- Id: h.goal.Id,
- Name: h.goal.Name,
- Description: h.goal.Description,
- Deleted: h.goal.Deleted,
- CreatedAt: h.goal.CreatedAt,
- UpdatedAt: h.goal.UpdatedAt,
+ Id: h.goal.Id,
+ Name: h.goal.Name,
+ Description: h.goal.Description,
+ ConnectionType: h.goal.ConnectionType,
+ Deleted: h.goal.Deleted,
+ CreatedAt: h.goal.CreatedAt,
+ UpdatedAt: h.goal.UpdatedAt,
})
}
diff --git a/pkg/experiment/command/goal_test.go b/pkg/experiment/command/goal_test.go
index cdbd31e18e..e3c81ede73 100644
--- a/pkg/experiment/command/goal_test.go
+++ b/pkg/experiment/command/goal_test.go
@@ -33,7 +33,7 @@ func TestHandleRenameGoalCommand(t *testing.T) {
mockController := gomock.NewController(t)
defer mockController.Finish()
publisher := publishermock.NewMockPublisher(mockController)
- g, err := domain.NewGoal("gId", "gName", "gDesc")
+ g, err := domain.NewGoal("gId", "gName", "gDesc", experimentproto.Goal_UNKNOWN)
assert.NoError(t, err)
h := newGoalCommandHandler(t, publisher, g)
@@ -50,7 +50,7 @@ func TestHandleChangeDescriptionGoalCommand(t *testing.T) {
mockController := gomock.NewController(t)
defer mockController.Finish()
publisher := publishermock.NewMockPublisher(mockController)
- g, err := domain.NewGoal("gId", "gName", "gDesc")
+ g, err := domain.NewGoal("gId", "gName", "gDesc", experimentproto.Goal_UNKNOWN)
assert.NoError(t, err)
h := newGoalCommandHandler(t, publisher, g)
@@ -67,7 +67,7 @@ func TestHandleArchiveGoalCommand(t *testing.T) {
mockController := gomock.NewController(t)
defer mockController.Finish()
publisher := publishermock.NewMockPublisher(mockController)
- g, err := domain.NewGoal("gId", "gName", "gDesc")
+ g, err := domain.NewGoal("gId", "gName", "gDesc", experimentproto.Goal_UNKNOWN)
assert.NoError(t, err)
h := newGoalCommandHandler(t, publisher, g)
@@ -83,7 +83,7 @@ func TestHandleDeleteGoalCommand(t *testing.T) {
mockController := gomock.NewController(t)
defer mockController.Finish()
publisher := publishermock.NewMockPublisher(mockController)
- g, err := domain.NewGoal("gId", "gName", "gDesc")
+ g, err := domain.NewGoal("gId", "gName", "gDesc", experimentproto.Goal_UNKNOWN)
assert.NoError(t, err)
h := newGoalCommandHandler(t, publisher, g)
diff --git a/pkg/experiment/domain/goal.go b/pkg/experiment/domain/goal.go
index f92bef695c..cd18b8c3d2 100644
--- a/pkg/experiment/domain/goal.go
+++ b/pkg/experiment/domain/goal.go
@@ -17,6 +17,9 @@ package domain
import (
"time"
+ "github.com/jinzhu/copier"
+ "google.golang.org/protobuf/types/known/wrapperspb"
+
proto "github.com/bucketeer-io/bucketeer/proto/experiment"
)
@@ -24,17 +27,44 @@ type Goal struct {
*proto.Goal
}
-func NewGoal(id, name, description string) (*Goal, error) {
+func NewGoal(
+ id, name, description string,
+ connectionType proto.Goal_ConnectionType,
+) (*Goal, error) {
now := time.Now().Unix()
return &Goal{&proto.Goal{
- Id: id,
- Name: name,
- Description: description,
- CreatedAt: now,
- UpdatedAt: now,
+ Id: id,
+ Name: name,
+ Description: description,
+ ConnectionType: connectionType,
+ CreatedAt: now,
+ UpdatedAt: now,
}}, nil
}
+func (g *Goal) Update(
+ name *wrapperspb.StringValue,
+ description *wrapperspb.StringValue,
+ archived *wrapperspb.BoolValue,
+) (*Goal, error) {
+ updated := &Goal{}
+ if err := copier.Copy(updated, g); err != nil {
+ return nil, err
+ }
+
+ if name != nil {
+ updated.Goal.Name = name.Value
+ }
+ if description != nil {
+ updated.Goal.Description = description.Value
+ }
+ if archived != nil {
+ updated.Goal.Archived = archived.Value
+ }
+ updated.Goal.UpdatedAt = time.Now().Unix()
+ return updated, nil
+}
+
func (g *Goal) Rename(name string) error {
g.Goal.Name = name
g.Goal.UpdatedAt = time.Now().Unix()
diff --git a/pkg/experiment/domain/goal_test.go b/pkg/experiment/domain/goal_test.go
index 26ba7faac2..6d385e51cb 100644
--- a/pkg/experiment/domain/goal_test.go
+++ b/pkg/experiment/domain/goal_test.go
@@ -17,9 +17,11 @@ package domain
import (
"testing"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "google.golang.org/protobuf/types/known/wrapperspb"
- "github.com/stretchr/testify/assert"
+ proto "github.com/bucketeer-io/bucketeer/proto/experiment"
)
func TestRenameGoal(t *testing.T) {
@@ -56,9 +58,51 @@ func TestSetDeletedGoal(t *testing.T) {
assert.True(t, g.Deleted)
}
+func TestUpdateGoal(t *testing.T) {
+ t.Parallel()
+ g := newGoal(t)
+
+ tests := []struct {
+ desc string
+ newName *wrapperspb.StringValue
+ newDesc *wrapperspb.StringValue
+ archived *wrapperspb.BoolValue
+ deleted *wrapperspb.BoolValue
+ }{
+ {
+ desc: "update goal",
+ newName: wrapperspb.String("newName"),
+ newDesc: wrapperspb.String("newDesc"),
+ archived: nil,
+ deleted: nil,
+ },
+ {
+ desc: "archive goal",
+ newName: nil,
+ newDesc: nil,
+ archived: wrapperspb.Bool(true),
+ deleted: nil,
+ },
+ }
+ for i := range tests {
+ tt := tests[i]
+ t.Run(tt.desc, func(t *testing.T) {
+ t.Parallel()
+ updated, err := g.Update(tt.newName, tt.newDesc, tt.archived)
+ require.NoError(t, err)
+ if tt.newName != nil {
+ assert.Equal(t, tt.newName.Value, updated.Name)
+ }
+ if tt.newDesc != nil {
+ assert.Equal(t, tt.newDesc.Value, updated.Description)
+ }
+ })
+ }
+}
+
func newGoal(t *testing.T) *Goal {
t.Helper()
- g, err := NewGoal("gID", "gName", "gDesc")
+ g, err := NewGoal("gID", "gName", "gDesc", proto.Goal_OPERATION)
require.NoError(t, err)
return g
}
diff --git a/pkg/experiment/storage/v2/experiment.go b/pkg/experiment/storage/v2/experiment.go
index 5ec1307781..073a3fc7a8 100644
--- a/pkg/experiment/storage/v2/experiment.go
+++ b/pkg/experiment/storage/v2/experiment.go
@@ -17,6 +17,7 @@ package v2
import (
"context"
+ _ "embed"
"errors"
"fmt"
@@ -29,6 +30,11 @@ var (
ErrExperimentAlreadyExists = errors.New("experiment: already exists")
ErrExperimentNotFound = errors.New("experiment: not found")
ErrExperimentUnexpectedAffectedRows = errors.New("experiment: unexpected affected rows")
+
+ //go:embed sql/experiment/select_experiments.sql
+ selectExperimentsSQL string
+ //go:embed sql/experiment/count_experiment.sql
+ countExperimentSQL string
)
type ExperimentStorage interface {
@@ -40,7 +46,7 @@ type ExperimentStorage interface {
whereParts []mysql.WherePart,
orders []*mysql.Order,
limit, offset int,
- ) ([]*proto.Experiment, int, int64, error)
+ ) ([]*proto.Experiment, int, int64, *proto.ListExperimentsResponse_Summary, error)
}
type experimentStorage struct {
@@ -244,7 +250,7 @@ func (s *experimentStorage) GetExperiment(
&status,
)
if err != nil {
- if err == mysql.ErrNoRows {
+ if errors.Is(err, mysql.ErrNoRows) {
return nil, ErrExperimentNotFound
}
return nil, err
@@ -258,39 +264,14 @@ func (s *experimentStorage) ListExperiments(
whereParts []mysql.WherePart,
orders []*mysql.Order,
limit, offset int,
-) ([]*proto.Experiment, int, int64, error) {
+) ([]*proto.Experiment, int, int64, *proto.ListExperimentsResponse_Summary, error) {
whereSQL, whereArgs := mysql.ConstructWhereSQLString(whereParts)
orderBySQL := mysql.ConstructOrderBySQLString(orders)
limitOffsetSQL := mysql.ConstructLimitOffsetSQLString(limit, offset)
- query := fmt.Sprintf(`
- SELECT
- id,
- goal_id,
- feature_id,
- feature_version,
- variations,
- start_at,
- stop_at,
- stopped,
- stopped_at,
- created_at,
- updated_at,
- archived,
- deleted,
- goal_ids,
- name,
- description,
- base_variation_id,
- maintainer,
- status
- FROM
- experiment
- %s %s %s
- `, whereSQL, orderBySQL, limitOffsetSQL,
- )
+ query := fmt.Sprintf(selectExperimentsSQL, whereSQL, orderBySQL, limitOffsetSQL)
rows, err := s.qe.QueryContext(ctx, query, whereArgs...)
if err != nil {
- return nil, 0, 0, err
+ return nil, 0, 0, nil, err
}
defer rows.Close()
experiments := make([]*proto.Experiment, 0, limit)
@@ -317,29 +298,29 @@ func (s *experimentStorage) ListExperiments(
&experiment.BaseVariationId,
&experiment.Maintainer,
&status,
+ &mysql.JSONObject{Val: &experiment.Goals},
)
if err != nil {
- return nil, 0, 0, err
+ return nil, 0, 0, nil, err
}
experiment.Status = proto.Experiment_Status(status)
experiments = append(experiments, &experiment)
}
if rows.Err() != nil {
- return nil, 0, 0, err
+ return nil, 0, 0, nil, err
}
nextOffset := offset + len(experiments)
var totalCount int64
- countQuery := fmt.Sprintf(`
- SELECT
- COUNT(1)
- FROM
- experiment
- %s
- `, whereSQL,
+ summary := &proto.ListExperimentsResponse_Summary{}
+ countQuery := fmt.Sprintf(countExperimentSQL, whereSQL)
+ err = s.qe.QueryRowContext(ctx, countQuery, whereArgs...).Scan(
+ &totalCount,
+ &summary.TotalWaitingCount,
+ &summary.TotalRunningCount,
+ &summary.TotalStoppedCount,
)
- err = s.qe.QueryRowContext(ctx, countQuery, whereArgs...).Scan(&totalCount)
if err != nil {
- return nil, 0, 0, err
+ return nil, 0, 0, nil, err
}
- return experiments, nextOffset, totalCount, nil
+ return experiments, nextOffset, totalCount, summary, nil
}
diff --git a/pkg/experiment/storage/v2/experiment_test.go b/pkg/experiment/storage/v2/experiment_test.go
index 19560df967..f04ea9472e 100644
--- a/pkg/experiment/storage/v2/experiment_test.go
+++ b/pkg/experiment/storage/v2/experiment_test.go
@@ -247,7 +247,7 @@ func TestListExperiments(t *testing.T) {
if p.setup != nil {
p.setup(storage)
}
- experiments, cursor, _, err := storage.ListExperiments(
+ experiments, cursor, _, _, err := storage.ListExperiments(
context.Background(),
p.whereParts,
p.orders,
diff --git a/pkg/experiment/storage/v2/goal.go b/pkg/experiment/storage/v2/goal.go
index 9acb6978ce..1f54e607f4 100644
--- a/pkg/experiment/storage/v2/goal.go
+++ b/pkg/experiment/storage/v2/goal.go
@@ -17,6 +17,7 @@ package v2
import (
"context"
+ _ "embed"
"errors"
"fmt"
@@ -29,6 +30,19 @@ var (
ErrGoalAlreadyExists = errors.New("goal: already exists")
ErrGoalNotFound = errors.New("goal: not found")
ErrGoalUnexpectedAffectedRows = errors.New("goal: unexpected affected rows")
+
+ //go:embed sql/goal/select_goals.sql
+ selectGoalsSQL string
+ //go:embed sql/goal/select_goal.sql
+ selectGoalSQL string
+ //go:embed sql/goal/count_goals.sql
+ countGoalSQL string
+ //go:embed sql/goal/insert_goal.sql
+ insertGoalSQL string
+ //go:embed sql/goal/update_goal.sql
+ updateGoalSQL string
+ //go:embed sql/goal/delete_goal.sql
+ deleteGoalSQL string
)
type GoalStorage interface {
@@ -43,6 +57,7 @@ type GoalStorage interface {
isInUseStatus *bool,
environmentId string,
) ([]*proto.Goal, int, int64, error)
+ DeleteGoal(ctx context.Context, id, environmentId string) error
}
type goalStorage struct {
@@ -54,26 +69,13 @@ func NewGoalStorage(qe mysql.QueryExecer) GoalStorage {
}
func (s *goalStorage) CreateGoal(ctx context.Context, g *domain.Goal, environmentId string) error {
- query := `
- INSERT INTO goal (
- id,
- name,
- description,
- archived,
- deleted,
- created_at,
- updated_at,
- environment_id
- ) VALUES (
- ?, ?, ?, ?, ?, ?, ?, ?
- )
- `
_, err := s.qe.ExecContext(
ctx,
- query,
+ insertGoalSQL,
g.Id,
g.Name,
g.Description,
+ g.ConnectionType,
g.Archived,
g.Deleted,
g.CreatedAt,
@@ -81,7 +83,7 @@ func (s *goalStorage) CreateGoal(ctx context.Context, g *domain.Goal, environmen
environmentId,
)
if err != nil {
- if err == mysql.ErrDuplicateEntry {
+ if errors.Is(err, mysql.ErrDuplicateEntry) {
return ErrGoalAlreadyExists
}
return err
@@ -90,23 +92,9 @@ func (s *goalStorage) CreateGoal(ctx context.Context, g *domain.Goal, environmen
}
func (s *goalStorage) UpdateGoal(ctx context.Context, g *domain.Goal, environmentId string) error {
- query := `
- UPDATE
- goal
- SET
- name = ?,
- description = ?,
- archived = ?,
- deleted = ?,
- created_at = ?,
- updated_at = ?
- WHERE
- id = ? AND
- environment_id = ?
- `
result, err := s.qe.ExecContext(
ctx,
- query,
+ updateGoalSQL,
g.Name,
g.Description,
g.Archived,
@@ -131,36 +119,9 @@ func (s *goalStorage) UpdateGoal(ctx context.Context, g *domain.Goal, environmen
func (s *goalStorage) GetGoal(ctx context.Context, id, environmentId string) (*domain.Goal, error) {
goal := proto.Goal{}
- query := `
- SELECT
- id,
- name,
- description,
- archived,
- deleted,
- created_at,
- updated_at,
- CASE
- WHEN (
- SELECT
- COUNT(1)
- FROM
- experiment
- WHERE
- environment_id = ? AND
- goal_ids LIKE concat("%", goal.id, "%")
- ) > 0 THEN TRUE
- ELSE FALSE
- END AS is_in_use_status
- FROM
- goal
- WHERE
- id = ? AND
- environment_id = ?
- `
err := s.qe.QueryRowContext(
ctx,
- query,
+ selectGoalSQL,
environmentId,
id,
environmentId,
@@ -168,14 +129,16 @@ func (s *goalStorage) GetGoal(ctx context.Context, id, environmentId string) (*d
&goal.Id,
&goal.Name,
&goal.Description,
+ &goal.ConnectionType,
&goal.Archived,
&goal.Deleted,
&goal.CreatedAt,
&goal.UpdatedAt,
&goal.IsInUseStatus,
+ &mysql.JSONObject{Val: &goal.Experiments},
)
if err != nil {
- if err == mysql.ErrNoRows {
+ if errors.Is(err, mysql.ErrNoRows) {
return nil, ErrGoalNotFound
}
return nil, err
@@ -205,32 +168,7 @@ func (s *goalStorage) ListGoals(
isInUseStatusSQL = "HAVING is_in_use_status = FALSE"
}
}
- query := fmt.Sprintf(`
- SELECT
- id,
- name,
- description,
- archived,
- deleted,
- created_at,
- updated_at,
- CASE
- WHEN (
- SELECT
- COUNT(1)
- FROM
- experiment
- WHERE
- environment_id = ? AND
- goal_ids LIKE concat("%%", goal.id, "%%")
- ) > 0 THEN TRUE
- ELSE FALSE
- END AS is_in_use_status
- FROM
- goal
- %s %s %s %s
- `, whereSQL, isInUseStatusSQL, orderBySQL, limitOffsetSQL,
- )
+ query := fmt.Sprintf(selectGoalsSQL, whereSQL, isInUseStatusSQL, orderBySQL, limitOffsetSQL)
rows, err := s.qe.QueryContext(ctx, query, prepareArgs...)
if err != nil {
return nil, 0, 0, err
@@ -243,11 +181,13 @@ func (s *goalStorage) ListGoals(
&goal.Id,
&goal.Name,
&goal.Description,
+ &goal.ConnectionType,
&goal.Archived,
&goal.Deleted,
&goal.CreatedAt,
&goal.UpdatedAt,
&goal.IsInUseStatus,
+ &mysql.JSONObject{Val: &goal.Experiments},
)
if err != nil {
return nil, 0, 0, err
@@ -267,29 +207,30 @@ func (s *goalStorage) ListGoals(
countConditionSQL = "> 0 THEN NULL ELSE 1"
}
}
- countQuery := fmt.Sprintf(`
- SELECT
- COUNT(
- CASE
- WHEN (
- SELECT
- COUNT(1)
- FROM
- experiment
- WHERE
- environment_id = ? AND
- goal_ids LIKE concat("%%", goal.id, "%%")
- ) %s
- END
- )
- FROM
- goal
- %s
- `, countConditionSQL, whereSQL,
- )
+ countQuery := fmt.Sprintf(countGoalSQL, countConditionSQL, whereSQL)
err = s.qe.QueryRowContext(ctx, countQuery, prepareArgs...).Scan(&totalCount)
if err != nil {
return nil, 0, 0, err
}
return goals, nextOffset, totalCount, nil
}
+
+func (s *goalStorage) DeleteGoal(ctx context.Context, id, environmentId string) error {
+ result, err := s.qe.ExecContext(
+ ctx,
+ deleteGoalSQL,
+ id,
+ environmentId,
+ )
+ if err != nil {
+ return err
+ }
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return err
+ }
+ if rowsAffected != 1 {
+ return ErrGoalUnexpectedAffectedRows
+ }
+ return nil
+}
diff --git a/pkg/experiment/storage/v2/mock/experiment.go b/pkg/experiment/storage/v2/mock/experiment.go
index f18c2a203e..ecfc28f496 100644
--- a/pkg/experiment/storage/v2/mock/experiment.go
+++ b/pkg/experiment/storage/v2/mock/experiment.go
@@ -73,14 +73,15 @@ func (mr *MockExperimentStorageMockRecorder) GetExperiment(ctx, id, environmentI
}
// ListExperiments mocks base method.
-func (m *MockExperimentStorage) ListExperiments(ctx context.Context, whereParts []mysql.WherePart, orders []*mysql.Order, limit, offset int) ([]*experiment.Experiment, int, int64, error) {
+func (m *MockExperimentStorage) ListExperiments(ctx context.Context, whereParts []mysql.WherePart, orders []*mysql.Order, limit, offset int) ([]*experiment.Experiment, int, int64, *experiment.ListExperimentsResponse_Summary, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListExperiments", ctx, whereParts, orders, limit, offset)
ret0, _ := ret[0].([]*experiment.Experiment)
ret1, _ := ret[1].(int)
ret2, _ := ret[2].(int64)
- ret3, _ := ret[3].(error)
- return ret0, ret1, ret2, ret3
+ ret3, _ := ret[3].(*experiment.ListExperimentsResponse_Summary)
+ ret4, _ := ret[4].(error)
+ return ret0, ret1, ret2, ret3, ret4
}
// ListExperiments indicates an expected call of ListExperiments.
diff --git a/pkg/experiment/storage/v2/mock/goal.go b/pkg/experiment/storage/v2/mock/goal.go
index e9af872231..5c50f826b7 100644
--- a/pkg/experiment/storage/v2/mock/goal.go
+++ b/pkg/experiment/storage/v2/mock/goal.go
@@ -57,6 +57,20 @@ func (mr *MockGoalStorageMockRecorder) CreateGoal(ctx, g, environmentId any) *go
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGoal", reflect.TypeOf((*MockGoalStorage)(nil).CreateGoal), ctx, g, environmentId)
}
+// DeleteGoal mocks base method.
+func (m *MockGoalStorage) DeleteGoal(ctx context.Context, id, environmentId string) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DeleteGoal", ctx, id, environmentId)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// DeleteGoal indicates an expected call of DeleteGoal.
+func (mr *MockGoalStorageMockRecorder) DeleteGoal(ctx, id, environmentId any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGoal", reflect.TypeOf((*MockGoalStorage)(nil).DeleteGoal), ctx, id, environmentId)
+}
+
// GetGoal mocks base method.
func (m *MockGoalStorage) GetGoal(ctx context.Context, id, environmentId string) (*domain.Goal, error) {
m.ctrl.T.Helper()
diff --git a/pkg/experiment/storage/v2/sql/experiment/count_experiment.sql b/pkg/experiment/storage/v2/sql/experiment/count_experiment.sql
new file mode 100644
index 0000000000..631a541400
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/experiment/count_experiment.sql
@@ -0,0 +1,8 @@
+SELECT
+ COUNT(1) AS total,
+ COALESCE(SUM(IF(status = 0, 1, 0)), 0) AS waiting,
+ COALESCE(SUM(IF(status = 1, 1, 0)), 0) AS running,
+ COALESCE(SUM(IF(status = 2 OR status = 3, 1, 0)), 0) AS stopped
+FROM
+ experiment
+%s
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/experiment/select_experiments.sql b/pkg/experiment/storage/v2/sql/experiment/select_experiments.sql
new file mode 100644
index 0000000000..8843fc0347
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/experiment/select_experiments.sql
@@ -0,0 +1,30 @@
+SELECT
+ ex.id,
+ ex.goal_id,
+ ex.feature_id,
+ ex.feature_version,
+ ex.variations,
+ ex.start_at,
+ ex.stop_at,
+ ex.stopped,
+ ex.stopped_at,
+ ex.created_at,
+ ex.updated_at,
+ ex.archived,
+ ex.deleted,
+ ex.goal_ids,
+ ex.name,
+ ex.description,
+ ex.base_variation_id,
+ ex.maintainer,
+ ex.status,
+ (
+ SELECT
+ JSON_ARRAYAGG(JSON_OBJECT('id', goal.id, 'name', goal.name))
+ FROM
+ goal
+ WHERE json_contains(ex.goal_ids, concat('"', goal.id, '"'), '$')
+ ) as goals
+FROM
+ experiment ex
+%s %s %s
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/count_goals.sql b/pkg/experiment/storage/v2/sql/goal/count_goals.sql
new file mode 100644
index 0000000000..67dde3ca54
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/count_goals.sql
@@ -0,0 +1,17 @@
+SELECT
+ COUNT(
+ CASE
+ WHEN (
+ SELECT
+ COUNT(1)
+ FROM
+ experiment
+ WHERE
+ environment_id = ? AND
+ goal_ids LIKE concat("%%", goal.id, "%%")
+ ) %s
+ END
+ )
+FROM
+ goal
+ %s
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/delete_goal.sql b/pkg/experiment/storage/v2/sql/goal/delete_goal.sql
new file mode 100644
index 0000000000..3c3e08c419
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/delete_goal.sql
@@ -0,0 +1,5 @@
+DELETE
+FROM
+ goal
+WHERE
+ id = ? AND environment_id = ?
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/insert_goal.sql b/pkg/experiment/storage/v2/sql/goal/insert_goal.sql
new file mode 100644
index 0000000000..fc849ce682
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/insert_goal.sql
@@ -0,0 +1,13 @@
+INSERT INTO goal (
+ id,
+ name,
+ description,
+ connection_type,
+ archived,
+ deleted,
+ created_at,
+ updated_at,
+ environment_id
+) VALUES (
+ ?, ?, ?, ?, ?, ?, ?, ?, ?
+)
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/select_goal.sql b/pkg/experiment/storage/v2/sql/goal/select_goal.sql
new file mode 100644
index 0000000000..61bfb80836
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/select_goal.sql
@@ -0,0 +1,32 @@
+SELECT
+ goal.id,
+ goal.name,
+ goal.description,
+ goal.connection_type,
+ goal.archived,
+ goal.deleted,
+ goal.created_at,
+ goal.updated_at,
+ CASE
+ WHEN (
+ SELECT
+ COUNT(1)
+ FROM
+ experiment ex1
+ WHERE
+ ex1.environment_id = ? AND
+ ex1.goal_ids LIKE concat("%%", goal.id, "%%")
+ ) > 0 THEN TRUE
+ ELSE FALSE
+ END AS is_in_use_status,
+ (
+ select
+ JSON_ARRAYAGG(JSON_OBJECT('id', ex2.id, 'name', ex2.name))
+ from experiment ex2
+ where json_contains(ex2.goal_ids, concat('"', goal.id, '"'), '$')
+ ) as experiments
+FROM
+ goal
+WHERE
+ id = ? AND
+ environment_id = ?
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/select_goals.sql b/pkg/experiment/storage/v2/sql/goal/select_goals.sql
new file mode 100644
index 0000000000..76ae8a1831
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/select_goals.sql
@@ -0,0 +1,30 @@
+SELECT
+ goal.id,
+ goal.name,
+ goal.description,
+ goal.connection_type,
+ goal.archived,
+ goal.deleted,
+ goal.created_at,
+ goal.updated_at,
+ CASE
+ WHEN (
+ SELECT
+ COUNT(1)
+ FROM
+ experiment ex1
+ WHERE
+ ex1.environment_id = ? AND
+ ex1.goal_ids LIKE concat("%%", goal.id, "%%")
+ ) > 0 THEN TRUE
+ ELSE FALSE
+ END AS is_in_use_status,
+ (
+ select
+ JSON_ARRAYAGG(JSON_OBJECT('id', ex2.id, 'name', ex2.name))
+ from experiment ex2
+ where json_contains(ex2.goal_ids, concat('"', goal.id, '"'), '$')
+ ) as experiments
+FROM
+ goal
+ %s %s %s %s
\ No newline at end of file
diff --git a/pkg/experiment/storage/v2/sql/goal/update_goal.sql b/pkg/experiment/storage/v2/sql/goal/update_goal.sql
new file mode 100644
index 0000000000..29c6dfed89
--- /dev/null
+++ b/pkg/experiment/storage/v2/sql/goal/update_goal.sql
@@ -0,0 +1,12 @@
+UPDATE
+ goal
+SET
+ name = ?,
+ description = ?,
+ archived = ?,
+ deleted = ?,
+ created_at = ?,
+ updated_at = ?
+WHERE
+ id = ? AND
+ environment_id = ?
\ No newline at end of file
diff --git a/pkg/feature/api/feature.go b/pkg/feature/api/feature.go
index 1ed66e33e9..6d64988cc1 100644
--- a/pkg/feature/api/feature.go
+++ b/pkg/feature/api/feature.go
@@ -1396,26 +1396,10 @@ func (s *FeatureService) updateFeature(
return dt.Err()
}
var handler *command.FeatureCommandHandler = command.NewEmptyFeatureCommandHandler()
- tx, err := s.mysqlClient.BeginTx(ctx)
- if err != nil {
- s.logger.Error(
- "Failed to begin transaction",
- log.FieldsFromImcomingContext(ctx).AddFields(
- zap.Error(err),
- )...,
- )
- dt, err := statusInternal.WithDetails(&errdetails.LocalizedMessage{
- Locale: localizer.GetLocale(),
- Message: localizer.MustLocalize(locale.InternalServerError),
- })
- if err != nil {
- return statusInternal.Err()
- }
- return dt.Err()
- }
- err = s.mysqlClient.RunInTransaction(ctx, tx, func() error {
+
+ err := s.mysqlClient.RunInTransactionV2(ctx, func(contextWithTx context.Context, tx mysql.Transaction) error {
featureStorage := v2fs.NewFeatureStorage(tx)
- feature, err := featureStorage.GetFeature(ctx, id, environmentId)
+ feature, err := featureStorage.GetFeature(contextWithTx, id, environmentId)
if err != nil {
s.logger.Error(
"Failed to get feature",
@@ -1444,7 +1428,7 @@ func (s *FeatureService) updateFeature(
// We must stop the progressive rollout if it contains a `DisableFeatureCommand`
switch cmd.(type) {
case *featureproto.DisableFeatureCommand:
- if err := s.stopProgressiveRollout(ctx, tx, environmentId, feature.Id); err != nil {
+ if err := s.stopProgressiveRollout(contextWithTx, environmentId, feature.Id); err != nil {
return err
}
}
@@ -1458,7 +1442,7 @@ func (s *FeatureService) updateFeature(
)
return err
}
- if err := featureStorage.UpdateFeature(ctx, feature, environmentId); err != nil {
+ if err := featureStorage.UpdateFeature(contextWithTx, feature, environmentId); err != nil {
s.logger.Error(
"Failed to update feature",
log.FieldsFromImcomingContext(ctx).AddFields(
@@ -1863,7 +1847,7 @@ func (s *FeatureService) UpdateFeatureTargeting(
// We must stop the progressive rollout if it contains a `DisableFeatureCommand`
switch cmd.(type) {
case *featureproto.DisableFeatureCommand:
- if err := s.stopProgressiveRollout(ctx, tx, req.EnvironmentId, feature.Id); err != nil {
+ if err := s.stopProgressiveRollout(ctx, req.EnvironmentId, feature.Id); err != nil {
return err
}
}
@@ -1919,9 +1903,8 @@ func (s *FeatureService) UpdateFeatureTargeting(
func (s *FeatureService) stopProgressiveRollout(
ctx context.Context,
- tx mysql.Transaction,
EnvironmentId, featureID string) error {
- storage := v2ao.NewProgressiveRolloutStorage(tx)
+ storage := v2ao.NewProgressiveRolloutStorage(s.mysqlClient)
ids := convToInterfaceSlice([]string{featureID})
whereParts := []mysql.WherePart{
mysql.NewFilter("environment_id", "=", EnvironmentId),
diff --git a/pkg/feature/api/feature_test.go b/pkg/feature/api/feature_test.go
index ca7fdb2c31..e98f3b6405 100644
--- a/pkg/feature/api/feature_test.go
+++ b/pkg/feature/api/feature_test.go
@@ -1760,9 +1760,8 @@ func TestEnableFeatureMySQL(t *testing.T) {
{
desc: "error: statusNotFound",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2fs.ErrFeatureNotFound)
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(gomock.Any(), gomock.Any()).Return(
&envproto.GetEnvironmentV2Response{
@@ -1781,9 +1780,8 @@ func TestEnableFeatureMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
s.batchClient.(*btclientmock.MockClient).EXPECT().ExecuteBatchJob(gomock.Any(), gomock.Any())
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(
@@ -1866,9 +1864,8 @@ func TestDisableFeatureMySQL(t *testing.T) {
{
desc: "error: statusNotFound",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2fs.ErrFeatureNotFound)
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(gomock.Any(), gomock.Any()).Return(
&envproto.GetEnvironmentV2Response{
@@ -1887,9 +1884,8 @@ func TestDisableFeatureMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
s.batchClient.(*btclientmock.MockClient).EXPECT().ExecuteBatchJob(gomock.Any(), gomock.Any())
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(
@@ -2021,9 +2017,8 @@ func TestUnarchiveFeatureMySQL(t *testing.T) {
{
desc: "error: statusNotFound",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2fs.ErrFeatureNotFound)
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(gomock.Any(), gomock.Any()).Return(
&envproto.GetEnvironmentV2Response{
@@ -2042,9 +2037,8 @@ func TestUnarchiveFeatureMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
s.batchClient.(*btclientmock.MockClient).EXPECT().ExecuteBatchJob(gomock.Any(), gomock.Any())
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(
@@ -2127,9 +2121,8 @@ func TestDeleteFeatureMySQL(t *testing.T) {
{
desc: "error: statusNotFound",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(v2fs.ErrFeatureNotFound)
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(gomock.Any(), gomock.Any()).Return(
&envproto.GetEnvironmentV2Response{
@@ -2148,9 +2141,8 @@ func TestDeleteFeatureMySQL(t *testing.T) {
{
desc: "success",
setup: func(s *FeatureService) {
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().BeginTx(gomock.Any()).Return(nil, nil)
- s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransaction(
- gomock.Any(), gomock.Any(), gomock.Any(),
+ s.mysqlClient.(*mysqlmock.MockClient).EXPECT().RunInTransactionV2(
+ gomock.Any(), gomock.Any(),
).Return(nil)
s.batchClient.(*btclientmock.MockClient).EXPECT().ExecuteBatchJob(gomock.Any(), gomock.Any())
s.environmentClient.(*envclientmock.MockClient).EXPECT().GetEnvironmentV2(
diff --git a/pkg/feature/domain/feature.go b/pkg/feature/domain/feature.go
index 4fad8f0033..2e7adb2cfc 100644
--- a/pkg/feature/domain/feature.go
+++ b/pkg/feature/domain/feature.go
@@ -57,7 +57,6 @@ var (
errVariationInUse = errors.New("feature: variation in use")
errVariationNotFound = errors.New("feature: variation not found")
errVariationTypeUnmatched = errors.New("feature: variation value and type are unmatched")
- errTagsMustHaveAtLeastOneTag = errors.New("feature: tags must have at least one tag set")
errUnsupportedStrategy = errors.New("feature: unsupported strategy")
errPrerequisiteNotFound = errors.New("feature: prerequisite not found")
ErrAlreadyEnabled = errors.New("feature: already enabled")
@@ -161,14 +160,15 @@ func (f *Feature) AddTag(tag string) error {
}
func (f *Feature) RemoveTag(tag string) error {
- if len(f.Tags) <= 1 {
- return errTagsMustHaveAtLeastOneTag
- }
idx, err := index(tag, f.Tags)
if err != nil {
return err
}
- f.Tags = append(f.Tags[:idx], f.Tags[idx+1:]...)
+ if len(f.Tags) == 1 {
+ f.Tags = []string{}
+ } else {
+ f.Tags = append(f.Tags[:idx], f.Tags[idx+1:]...)
+ }
f.UpdatedAt = time.Now().Unix()
return nil
}
@@ -1116,9 +1116,6 @@ func validate(f *feature.Feature) error {
if f.Name == "" {
return errNameEmpty
}
- if len(f.Tags) == 0 {
- return errTagsMustHaveAtLeastOneTag
- }
if err := validateVariations(f.VariationType, f.Variations); err != nil {
return err
}
diff --git a/pkg/feature/domain/feature_test.go b/pkg/feature/domain/feature_test.go
index 8b67d00de9..3973d0d5a2 100644
--- a/pkg/feature/domain/feature_test.go
+++ b/pkg/feature/domain/feature_test.go
@@ -281,14 +281,16 @@ func TestRemoveTag(t *testing.T) {
f.AddTag(tag1)
f.AddTag(tag2)
f.RemoveTag(tag1)
+ f.RemoveTag("not-exist-tag")
if f.Tags[0] == tag1 {
t.Fatalf("Failed to remove tag %s. Tags: %v", tag1, f.Tags)
}
if len(f.Tags) != 1 {
t.Fatalf("Failed to remove tag. It should remove only 1: %v", f.Tags)
}
- if err := f.RemoveTag(tag2); err != errTagsMustHaveAtLeastOneTag {
- t.Fatalf("Failed to remove tag. It must keep at least 1 tag %v", f.Tags)
+ f.RemoveTag(tag2)
+ if len(f.Tags) != 0 {
+ t.Fatalf("Failed to remove tag. It should remove: %s. Actual: %v", tag2, f.Tags)
}
}
diff --git a/pkg/locale/localizedata/en.yaml b/pkg/locale/localizedata/en.yaml
index 9875a4e31c..5b830e5a08 100644
--- a/pkg/locale/localizedata/en.yaml
+++ b/pkg/locale/localizedata/en.yaml
@@ -67,6 +67,7 @@ TrialProject: "Trial project"
Webhook: "Webhook"
WebhookRule: "Webhook rule"
FlagTrigger: "Flag Trigger"
+CodeReference: "Code reference"
# Error sentences
RequiredField: "{{ .Field_1 }} is required"
diff --git a/pkg/locale/localizedata/ja.yaml b/pkg/locale/localizedata/ja.yaml
index d85d37ba2b..77c9ab6391 100644
--- a/pkg/locale/localizedata/ja.yaml
+++ b/pkg/locale/localizedata/ja.yaml
@@ -71,6 +71,7 @@ Variation: "バリエーション"
Webhook: "Webhook"
WebhookRule: "Webhookのルール"
FlagTrigger: "フラグトリガー"
+CodeReference: "コードリファレンス"
# Error sentences
RequiredField: "{{ .Field_1 }}は必須です"
diff --git a/pkg/locale/localizer.go b/pkg/locale/localizer.go
index 1275c567e8..1dfc824219 100644
--- a/pkg/locale/localizer.go
+++ b/pkg/locale/localizer.go
@@ -103,7 +103,7 @@ const (
Webhook = "Webhook"
WebhookRule = "WebhookRule"
FlagTrigger = "FlagTrigger"
-
+ CodeReference = "CodeReference"
// error sentence
RequiredFieldTemplate = "RequiredField"
InternalServerError = "InternalServerError"
diff --git a/pkg/role/role.go b/pkg/role/role.go
index 77d02f6ade..ff83201f2a 100644
--- a/pkg/role/role.go
+++ b/pkg/role/role.go
@@ -81,7 +81,7 @@ func CheckEnvironmentRole(
if token.IsSystemAdmin {
return checkRole(token.Email, token.Name, accountproto.AccountV2_Role_Environment_EDITOR, requiredRole, true)
}
- // get account for the environment namespace
+ // get account for the environment id
account, err := getAccountFunc(token.Email)
if err != nil {
if code := status.Code(err); code == codes.NotFound {
diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go
index 1817b5ab58..a7d70d1841 100644
--- a/pkg/storage/storage.go
+++ b/pkg/storage/storage.go
@@ -23,8 +23,7 @@ import (
)
const (
- AdminEnvironmentNamespace = ""
- AdminEnvironmentID = ""
+ AdminEnvironmentID = ""
OrderDirectionAsc OrderDirection = 0
OrderDirectionDesc OrderDirection = 1
diff --git a/pkg/storage/v2/mysql/client.go b/pkg/storage/v2/mysql/client.go
index c435cffbad..8b7e73f734 100644
--- a/pkg/storage/v2/mysql/client.go
+++ b/pkg/storage/v2/mysql/client.go
@@ -28,6 +28,7 @@ import (
)
const dsnParams = "collation=utf8mb4_bin"
+const transactionKey = "transaction"
type options struct {
connMaxLifetime time.Duration
@@ -103,8 +104,14 @@ type QueryExecer interface {
type Client interface {
QueryExecer
Close() error
+ // Deprecated
BeginTx(ctx context.Context) (Transaction, error)
RunInTransaction(ctx context.Context, tx Transaction, f func() error) error
+ // ToDo:
+ // Transaction is passed because it is required for storage that does not support storage architecture refactoring,
+ // but we plan to remove it once the refactoring is complete.
+ RunInTransactionV2(ctx context.Context, f func(ctx context.Context, tx Transaction) error) error
+ Qe(ctx context.Context) QueryExecer
}
type client struct {
@@ -179,6 +186,7 @@ func (c *client) QueryRowContext(ctx context.Context, query string, args ...inte
return r
}
+// Deprecated
func (c *client) BeginTx(ctx context.Context) (Transaction, error) {
var err error
defer record()(operationBeginTx, &err)
@@ -199,3 +207,31 @@ func (c *client) RunInTransaction(ctx context.Context, tx Transaction, f func()
}
return err
}
+
+func (c *client) RunInTransactionV2(
+ ctx context.Context,
+ f func(ctx context.Context, ctxWithTx Transaction) error) error {
+ tx, err := c.BeginTx(ctx)
+ if err != nil {
+ return fmt.Errorf("client: begin tx: %w", err)
+ }
+ ctx = context.WithValue(ctx, transactionKey, tx)
+ defer record()(operationRunInTransaction, &err)
+ defer func() {
+ if err != nil {
+ tx.Rollback() // nolint:errcheck
+ }
+ }()
+ if err = f(ctx, tx); err == nil {
+ err = tx.Commit()
+ }
+ return err
+}
+
+func (c *client) Qe(ctx context.Context) QueryExecer {
+ tx, ok := ctx.Value(transactionKey).(Transaction)
+ if ok {
+ return tx
+ }
+ return c
+}
diff --git a/pkg/storage/v2/mysql/mock/client.go b/pkg/storage/v2/mysql/mock/client.go
index d3cc0b7e75..0c81649b57 100644
--- a/pkg/storage/v2/mysql/mock/client.go
+++ b/pkg/storage/v2/mysql/mock/client.go
@@ -277,6 +277,20 @@ func (mr *MockClientMockRecorder) ExecContext(ctx, query any, args ...any) *gomo
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExecContext", reflect.TypeOf((*MockClient)(nil).ExecContext), varargs...)
}
+// Qe mocks base method.
+func (m *MockClient) Qe(ctx context.Context) mysql.QueryExecer {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "Qe", ctx)
+ ret0, _ := ret[0].(mysql.QueryExecer)
+ return ret0
+}
+
+// Qe indicates an expected call of Qe.
+func (mr *MockClientMockRecorder) Qe(ctx any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Qe", reflect.TypeOf((*MockClient)(nil).Qe), ctx)
+}
+
// QueryContext mocks base method.
func (m *MockClient) QueryContext(ctx context.Context, query string, args ...any) (mysql.Rows, error) {
m.ctrl.T.Helper()
@@ -329,3 +343,17 @@ func (mr *MockClientMockRecorder) RunInTransaction(ctx, tx, f any) *gomock.Call
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunInTransaction", reflect.TypeOf((*MockClient)(nil).RunInTransaction), ctx, tx, f)
}
+
+// RunInTransactionV2 mocks base method.
+func (m *MockClient) RunInTransactionV2(ctx context.Context, f func(context.Context, mysql.Transaction) error) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "RunInTransactionV2", ctx, f)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// RunInTransactionV2 indicates an expected call of RunInTransactionV2.
+func (mr *MockClientMockRecorder) RunInTransactionV2(ctx, f any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunInTransactionV2", reflect.TypeOf((*MockClient)(nil).RunInTransactionV2), ctx, f)
+}
diff --git a/pkg/subscriber/processor/domain_event_informer.go b/pkg/subscriber/processor/domain_event_informer.go
index 8ae5190aa3..dad19229c8 100644
--- a/pkg/subscriber/processor/domain_event_informer.go
+++ b/pkg/subscriber/processor/domain_event_informer.go
@@ -230,6 +230,8 @@ func (d domainEventInformer) convSourceType(
return notificationproto.Subscription_DOMAIN_EVENT_FLAG_TRIGGER, nil
case domaineventproto.Event_TAG:
return notificationproto.Subscription_DOMAIN_EVENT_TAG, nil
+ case domaineventproto.Event_CODEREF:
+ return notificationproto.Subscription_DOMAIN_EVENT_CODEREF, nil
}
return notificationproto.Subscription_SourceType(0), ErrUnknownSourceType
}
diff --git a/pkg/tag/api/api.go b/pkg/tag/api/api.go
index 5afd9ee71a..27f531c41b 100644
--- a/pkg/tag/api/api.go
+++ b/pkg/tag/api/api.go
@@ -177,7 +177,7 @@ func (s *TagService) validateCreateTagRquest(req *proto.CreateTagRequest, locali
}
return dt.Err()
}
- if req.EntityType == proto.Tag_UNKNOWN {
+ if req.EntityType == proto.Tag_UNSPECIFIED {
dt, err := statusEntityTypeRequired.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
Message: localizer.MustLocalizeWithTemplate(locale.RequiredFieldTemplate, "entity_type"),
@@ -201,17 +201,15 @@ func (s *TagService) ListTags(
if err != nil {
return nil, err
}
- whereParts := []mysql.WherePart{}
- if req.OrganizationId != "" {
- // New console
- whereParts = append(whereParts, mysql.NewSearchQuery([]string{"tag.organization_id"}, req.OrganizationId))
- } else {
- // Current console
- whereParts = append(whereParts, mysql.NewSearchQuery([]string{"tag.environment_id"}, req.EnvironmentId))
+ whereParts := []mysql.WherePart{
+ mysql.NewFilter("tag.environment_id", "=", req.EnvironmentId),
}
if req.SearchKeyword != "" {
whereParts = append(whereParts, mysql.NewSearchQuery([]string{"tag.name"}, req.SearchKeyword))
}
+ if req.EntityType != proto.Tag_UNSPECIFIED {
+ whereParts = append(whereParts, mysql.NewFilter("tag.entity_type", "=", req.EntityType))
+ }
orders, err := s.newListTagsOrdersMySQL(req.OrderBy, req.OrderDirection, localizer)
if err != nil {
s.logger.Error(
@@ -436,6 +434,8 @@ func (s *TagService) newListTagsOrdersMySQL(
column = "tag.created_at"
case proto.ListTagsRequest_UPDATED_AT:
column = "tag.updated_at"
+ case proto.ListTagsRequest_ENTITY_TYPE:
+ column = "tag.entity_type"
default:
dt, err := statusInvalidOrderBy.WithDetails(&errdetails.LocalizedMessage{
Locale: localizer.GetLocale(),
diff --git a/pkg/tag/storage/mock/tag.go b/pkg/tag/storage/mock/tag.go
index 691958a835..7f21bc54d4 100644
--- a/pkg/tag/storage/mock/tag.go
+++ b/pkg/tag/storage/mock/tag.go
@@ -72,6 +72,21 @@ func (mr *MockTagStorageMockRecorder) GetTag(ctx, id, environmentId any) *gomock
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTag", reflect.TypeOf((*MockTagStorage)(nil).GetTag), ctx, id, environmentId)
}
+// ListAllEnvironmentTags mocks base method.
+func (m *MockTagStorage) ListAllEnvironmentTags(ctx context.Context) ([]*tag.EnvironmentTag, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "ListAllEnvironmentTags", ctx)
+ ret0, _ := ret[0].([]*tag.EnvironmentTag)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// ListAllEnvironmentTags indicates an expected call of ListAllEnvironmentTags.
+func (mr *MockTagStorageMockRecorder) ListAllEnvironmentTags(ctx any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllEnvironmentTags", reflect.TypeOf((*MockTagStorage)(nil).ListAllEnvironmentTags), ctx)
+}
+
// ListTags mocks base method.
func (m *MockTagStorage) ListTags(ctx context.Context, whereParts []mysql.WherePart, orders []*mysql.Order, limit, offset int) ([]*tag.Tag, int, int64, error) {
m.ctrl.T.Helper()
diff --git a/pkg/tag/storage/sql/select_all_environment_tags.sql b/pkg/tag/storage/sql/select_all_environment_tags.sql
new file mode 100644
index 0000000000..92b24c9d69
--- /dev/null
+++ b/pkg/tag/storage/sql/select_all_environment_tags.sql
@@ -0,0 +1,11 @@
+SELECT
+ env.id AS environment_id,
+ tag.id,
+ tag.name,
+ tag.created_at,
+ tag.updated_at,
+ tag.entity_type,
+ tag.environment_id
+FROM tag
+JOIN environment_v2 env ON tag.environment_id = env.id
+ORDER BY env.id, tag.name;
diff --git a/pkg/tag/storage/tag.go b/pkg/tag/storage/tag.go
index d69fc2fc2b..b3fde123fe 100644
--- a/pkg/tag/storage/tag.go
+++ b/pkg/tag/storage/tag.go
@@ -36,6 +36,8 @@ var (
selectTagSQL string
//go:embed sql/select_tags.sql
selectTagsSQL string
+ //go:embed sql/select_all_environment_tags.sql
+ selectAllEnvironmentTagsSQL string
//go:embed sql/count_tags.sql
countTagsSQL string
//go:embed sql/delete_tag.sql
@@ -51,6 +53,7 @@ type TagStorage interface {
orders []*mysql.Order,
limit, offset int,
) ([]*proto.Tag, int, int64, error)
+ ListAllEnvironmentTags(ctx context.Context) ([]*proto.EnvironmentTag, error)
DeleteTag(ctx context.Context, id, environmentId string) error
}
@@ -151,6 +154,46 @@ func (s *tagStorage) ListTags(
return tags, nextOffset, totalCount, nil
}
+func (s *tagStorage) ListAllEnvironmentTags(ctx context.Context) ([]*proto.EnvironmentTag, error) {
+ rows, err := s.qe.QueryContext(ctx, selectAllEnvironmentTagsSQL)
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+ envTags := map[string][]*proto.Tag{}
+ for rows.Next() {
+ var entityType int32
+ var envID string
+ tag := proto.Tag{}
+ err := rows.Scan(
+ &envID,
+ &tag.Id,
+ &tag.Name,
+ &tag.CreatedAt,
+ &tag.UpdatedAt,
+ &entityType,
+ &tag.EnvironmentId,
+ )
+ if err != nil {
+ return nil, err
+ }
+ tag.EntityType = proto.Tag_EntityType(entityType)
+ envTags[envID] = append(envTags[envID], &tag)
+ }
+ if rows.Err() != nil {
+ return nil, err
+ }
+ environmentTags := make([]*proto.EnvironmentTag, 0, len(envTags))
+ for key, tags := range envTags {
+ envTag := &proto.EnvironmentTag{
+ EnvironmentId: key,
+ Tags: tags,
+ }
+ environmentTags = append(environmentTags, envTag)
+ }
+ return environmentTags, nil
+}
+
func (s *tagStorage) DeleteTag(ctx context.Context, id, environmentId string) error {
result, err := s.qe.ExecContext(ctx, deleteTagSQL, id)
if err != nil {
diff --git a/pkg/web/cmd/server/server.go b/pkg/web/cmd/server/server.go
index dd5bdb907f..4549033c94 100644
--- a/pkg/web/cmd/server/server.go
+++ b/pkg/web/cmd/server/server.go
@@ -37,6 +37,7 @@ import (
"github.com/bucketeer-io/bucketeer/pkg/cache"
cachev3 "github.com/bucketeer-io/bucketeer/pkg/cache/v3"
"github.com/bucketeer-io/bucketeer/pkg/cli"
+ coderefapi "github.com/bucketeer-io/bucketeer/pkg/coderef/api"
environmentapi "github.com/bucketeer-io/bucketeer/pkg/environment/api"
environmentclient "github.com/bucketeer-io/bucketeer/pkg/environment/client"
eventcounterapi "github.com/bucketeer-io/bucketeer/pkg/eventcounter/api"
@@ -101,27 +102,29 @@ type server struct {
domainTopic *string
bulkSegmentUsersReceivedTopic *string
// Port
- accountServicePort *int
- authServicePort *int
- auditLogServicePort *int
- autoOpsServicePort *int
- environmentServicePort *int
- eventCounterServicePort *int
- experimentServicePort *int
- featureServicePort *int
- notificationServicePort *int
- pushServicePort *int
- webConsoleServicePort *int
- dashboardServicePort *int
- tagServicePort *int
+ accountServicePort *int
+ authServicePort *int
+ auditLogServicePort *int
+ autoOpsServicePort *int
+ environmentServicePort *int
+ eventCounterServicePort *int
+ experimentServicePort *int
+ featureServicePort *int
+ notificationServicePort *int
+ pushServicePort *int
+ webConsoleServicePort *int
+ dashboardServicePort *int
+ tagServicePort *int
+ codeReferenceServicePort *int
// Service
- accountService *string
- authService *string
- batchService *string
- environmentService *string
- experimentService *string
- featureService *string
- autoOpsService *string
+ accountService *string
+ authService *string
+ batchService *string
+ environmentService *string
+ experimentService *string
+ featureService *string
+ autoOpsService *string
+ codeReferenceService *string
// auth
emailFilter *string
oauthConfigPath *string
@@ -239,6 +242,10 @@ func RegisterCommand(r cli.CommandRegistry, p cli.ParentCommand) cli.Command {
"tag-service-port",
"Port to bind to tag service.",
).Default("9104").Int(),
+ codeReferenceServicePort: cmd.Flag(
+ "code-reference-service-port",
+ "Port to bind to code reference service.",
+ ).Default("9105").Int(),
accountService: cmd.Flag(
"account-service",
"bucketeer-account-service address.",
@@ -267,6 +274,10 @@ func RegisterCommand(r cli.CommandRegistry, p cli.ParentCommand) cli.Command {
"autoops-service",
"bucketeer-autoops-service address.",
).Default("localhost:9001").String(),
+ codeReferenceService: cmd.Flag(
+ "code-reference-service",
+ "bucketeer-code-reference-service address.",
+ ).Default("localhost:9001").String(),
timezone: cmd.Flag("timezone", "Time zone").Required().String(),
certPath: cmd.Flag("cert", "Path to TLS certificate.").Required().String(),
keyPath: cmd.Flag("key", "Path to TLS key.").Required().String(),
@@ -574,6 +585,7 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
experimentService := experimentapi.NewExperimentService(
featureClient,
accountClient,
+ autoOpsClient,
mysqlClient,
domainTopicPublisher,
experimentapi.WithLogger(logger),
@@ -674,6 +686,21 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
rest.WithMetrics(registerer),
)
go dashboardServer.Run()
+ // codeReferenceService
+ codeReferenceService := coderefapi.NewCodeReferenceService(
+ accountClient,
+ mysqlClient,
+ domainTopicPublisher,
+ coderefapi.WithLogger(logger),
+ )
+ codeReferenceServer := rpc.NewServer(codeReferenceService, *s.certPath, *s.keyPath,
+ "code-reference-server",
+ rpc.WithPort(*s.codeReferenceServicePort),
+ rpc.WithVerifier(verifier),
+ rpc.WithMetrics(registerer),
+ rpc.WithLogger(logger),
+ )
+ go codeReferenceServer.Run()
// To detach this pod from Kubernetes Service before the app servers stop, we stop the health check service first.
// Then, after 10 seconds of sleep, the app servers can be shut down, as no new requests are expected to be sent.
// In this case, the Readiness prove must fail within 10 seconds and the pod must be detached.
@@ -692,6 +719,7 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
go pushServer.Stop(serverShutDownTimeout)
go tagServer.Stop(serverShutDownTimeout)
go webConsoleServer.Stop(serverShutDownTimeout)
+ go codeReferenceServer.Stop(serverShutDownTimeout)
go mysqlClient.Close()
go persistentRedisClient.Close()
go nonPersistentRedisClient.Close()
diff --git a/proto/Makefile b/proto/Makefile
index e4c77cf503..c7f4ff3194 100644
--- a/proto/Makefile
+++ b/proto/Makefile
@@ -1,5 +1,5 @@
PROTO_FOLDERS := $(filter-out ./external%, $(shell find . -name '*.proto' -not -path "./openapi/web_default_settings.proto" -print0 | xargs -0 -n1 dirname | sort --unique))
-PROTO_WITH_DESCRIPTOR_FOLDERS := ./account ./auditlog ./auth ./autoops ./environment ./eventcounter ./experiment ./feature ./gateway ./notification ./push ./batch ./tag
+PROTO_WITH_DESCRIPTOR_FOLDERS := ./account ./auditlog ./auth ./autoops ./environment ./eventcounter ./experiment ./feature ./gateway ./notification ./push ./batch ./tag ./coderef
PROTO_WITHOUT_DESCRIPTOR_FOLDERS := $(filter-out $(PROTO_WITH_DESCRIPTOR_FOLDERS), $(PROTO_FOLDERS))
GIT_TOP_DIR := $(shell cd .. ; pwd)
@@ -56,7 +56,7 @@ openapi-api-gen:
--openapiv2_opt=disable_service_tags=true \
${GIT_TOP_DIR}/proto/gateway/*.proto; \
-PROTO_OPENAPI_WEB_TARGETS := ${GIT_TOP_DIR}/proto/openapi/web_default_settings.proto ${GIT_TOP_DIR}/proto/auth/service.proto ${GIT_TOP_DIR}/proto/environment/service.proto ${GIT_TOP_DIR}/proto/account/service.proto ${GIT_TOP_DIR}/proto/notification/service.proto ${GIT_TOP_DIR}/proto/push/service.proto ${GIT_TOP_DIR}/proto/feature/service.proto ${GIT_TOP_DIR}/proto/experiment/service.proto ${GIT_TOP_DIR}/proto/tag/service.proto
+PROTO_OPENAPI_WEB_TARGETS := ${GIT_TOP_DIR}/proto/openapi/web_default_settings.proto ${GIT_TOP_DIR}/proto/auth/service.proto ${GIT_TOP_DIR}/proto/environment/service.proto ${GIT_TOP_DIR}/proto/account/service.proto ${GIT_TOP_DIR}/proto/notification/service.proto ${GIT_TOP_DIR}/proto/push/service.proto ${GIT_TOP_DIR}/proto/feature/service.proto ${GIT_TOP_DIR}/proto/experiment/service.proto ${GIT_TOP_DIR}/proto/tag/service.proto ${GIT_TOP_DIR}/proto/coderef/service.proto
.PHONY: openapi-web-gen
openapi-web-gen:
protoc \
diff --git a/proto/auditlog/proto_descriptor.pb b/proto/auditlog/proto_descriptor.pb
index 1298ea2047..3e367bd90b 100644
Binary files a/proto/auditlog/proto_descriptor.pb and b/proto/auditlog/proto_descriptor.pb differ
diff --git a/proto/batch/proto_descriptor.pb b/proto/batch/proto_descriptor.pb
index 533d1d38a6..3f250e02ed 100644
Binary files a/proto/batch/proto_descriptor.pb and b/proto/batch/proto_descriptor.pb differ
diff --git a/proto/batch/service.pb.go b/proto/batch/service.pb.go
index 2d1a3eabe0..9a2720e706 100644
--- a/proto/batch/service.pb.go
+++ b/proto/batch/service.pb.go
@@ -59,6 +59,7 @@ const (
BatchJob_ApiKeyCacher BatchJob = 15
BatchJob_AutoOpsRulesCacher BatchJob = 16
BatchJob_ExperimentCacher BatchJob = 17
+ BatchJob_TagDeleter BatchJob = 18
)
// Enum value maps for BatchJob.
@@ -82,6 +83,7 @@ var (
15: "ApiKeyCacher",
16: "AutoOpsRulesCacher",
17: "ExperimentCacher",
+ 18: "TagDeleter",
}
BatchJob_value = map[string]int32{
"ExperimentStatusUpdater": 0,
@@ -102,6 +104,7 @@ var (
"ApiKeyCacher": 15,
"AutoOpsRulesCacher": 16,
"ExperimentCacher": 17,
+ "TagDeleter": 18,
}
)
@@ -228,7 +231,7 @@ var file_proto_batch_service_proto_rawDesc = []byte{
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x42,
0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x12, 0x0a, 0x10,
0x42, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x2a, 0xbd, 0x03, 0x0a, 0x08, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x12, 0x1b, 0x0a,
+ 0x2a, 0xcd, 0x03, 0x0a, 0x08, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x12, 0x1b, 0x0a,
0x17, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x78,
0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x57,
@@ -256,6 +259,7 @@ var file_proto_batch_service_proto_rawDesc = []byte{
0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c,
0x65, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x72, 0x10, 0x10, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x78,
0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x72, 0x10, 0x11,
+ 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x10, 0x12,
0x32, 0x68, 0x0a, 0x0c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
0x12, 0x58, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68,
0x4a, 0x6f, 0x62, 0x12, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
diff --git a/proto/batch/service.proto b/proto/batch/service.proto
index 6f46ba0c91..66daebf9a1 100644
--- a/proto/batch/service.proto
+++ b/proto/batch/service.proto
@@ -36,6 +36,7 @@ enum BatchJob {
ApiKeyCacher = 15;
AutoOpsRulesCacher = 16;
ExperimentCacher = 17;
+ TagDeleter = 18;
}
message BatchJobRequest {
diff --git a/proto/coderef/code_reference.pb.go b/proto/coderef/code_reference.pb.go
new file mode 100644
index 0000000000..3f3b244d57
--- /dev/null
+++ b/proto/coderef/code_reference.pb.go
@@ -0,0 +1,382 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.23.4
+// source: proto/coderef/code_reference.proto
+
+package coderef
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type CodeReference_RepositoryType int32
+
+const (
+ CodeReference_REPOSITORY_TYPE_UNSPECIFIED CodeReference_RepositoryType = 0
+ CodeReference_GITHUB CodeReference_RepositoryType = 1
+ CodeReference_GITLAB CodeReference_RepositoryType = 2
+ CodeReference_BITBUCKET CodeReference_RepositoryType = 3
+ CodeReference_CUSTOM CodeReference_RepositoryType = 4
+)
+
+// Enum value maps for CodeReference_RepositoryType.
+var (
+ CodeReference_RepositoryType_name = map[int32]string{
+ 0: "REPOSITORY_TYPE_UNSPECIFIED",
+ 1: "GITHUB",
+ 2: "GITLAB",
+ 3: "BITBUCKET",
+ 4: "CUSTOM",
+ }
+ CodeReference_RepositoryType_value = map[string]int32{
+ "REPOSITORY_TYPE_UNSPECIFIED": 0,
+ "GITHUB": 1,
+ "GITLAB": 2,
+ "BITBUCKET": 3,
+ "CUSTOM": 4,
+ }
+)
+
+func (x CodeReference_RepositoryType) Enum() *CodeReference_RepositoryType {
+ p := new(CodeReference_RepositoryType)
+ *p = x
+ return p
+}
+
+func (x CodeReference_RepositoryType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (CodeReference_RepositoryType) Descriptor() protoreflect.EnumDescriptor {
+ return file_proto_coderef_code_reference_proto_enumTypes[0].Descriptor()
+}
+
+func (CodeReference_RepositoryType) Type() protoreflect.EnumType {
+ return &file_proto_coderef_code_reference_proto_enumTypes[0]
+}
+
+func (x CodeReference_RepositoryType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use CodeReference_RepositoryType.Descriptor instead.
+func (CodeReference_RepositoryType) EnumDescriptor() ([]byte, []int) {
+ return file_proto_coderef_code_reference_proto_rawDescGZIP(), []int{0, 0}
+}
+
+type CodeReference struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ FeatureId string `protobuf:"bytes,2,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ FilePath string `protobuf:"bytes,3,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,5,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,6,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,7,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryName string `protobuf:"bytes,8,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,9,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType CodeReference_RepositoryType `protobuf:"varint,10,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,11,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,12,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+ EnvironmentId string `protobuf:"bytes,13,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ CreatedAt int64 `protobuf:"varint,14,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+ UpdatedAt int64 `protobuf:"varint,15,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+ // URL to view the code in the repository
+ SourceUrl string `protobuf:"bytes,16,opt,name=source_url,json=sourceUrl,proto3" json:"source_url"`
+}
+
+func (x *CodeReference) Reset() {
+ *x = CodeReference{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_code_reference_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CodeReference) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CodeReference) ProtoMessage() {}
+
+func (x *CodeReference) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_code_reference_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CodeReference.ProtoReflect.Descriptor instead.
+func (*CodeReference) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_code_reference_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *CodeReference) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *CodeReference) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+func (x *CodeReference) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *CodeReference) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *CodeReference) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *CodeReference) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *CodeReference) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *CodeReference) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *CodeReference) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *CodeReference) GetRepositoryType() CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *CodeReference) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *CodeReference) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+func (x *CodeReference) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *CodeReference) GetCreatedAt() int64 {
+ if x != nil {
+ return x.CreatedAt
+ }
+ return 0
+}
+
+func (x *CodeReference) GetUpdatedAt() int64 {
+ if x != nil {
+ return x.UpdatedAt
+ }
+ return 0
+}
+
+func (x *CodeReference) GetSourceUrl() string {
+ if x != nil {
+ return x.SourceUrl
+ }
+ return ""
+}
+
+var File_proto_coderef_code_reference_proto protoreflect.FileDescriptor
+
+var file_proto_coderef_code_reference_proto_rawDesc = []byte{
+ 0x0a, 0x22, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x22, 0xc2, 0x05, 0x0a, 0x0d, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
+ 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
+ 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65,
+ 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73,
+ 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+ 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07,
+ 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61,
+ 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+ 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77,
+ 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63,
+ 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68,
+ 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61,
+ 0x73, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x64, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x50, 0x4f,
+ 0x53, 0x49, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
+ 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x49, 0x54,
+ 0x48, 0x55, 0x42, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10,
+ 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x49, 0x54, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x03,
+ 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f,
+ 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x62,
+ 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_coderef_code_reference_proto_rawDescOnce sync.Once
+ file_proto_coderef_code_reference_proto_rawDescData = file_proto_coderef_code_reference_proto_rawDesc
+)
+
+func file_proto_coderef_code_reference_proto_rawDescGZIP() []byte {
+ file_proto_coderef_code_reference_proto_rawDescOnce.Do(func() {
+ file_proto_coderef_code_reference_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_coderef_code_reference_proto_rawDescData)
+ })
+ return file_proto_coderef_code_reference_proto_rawDescData
+}
+
+var file_proto_coderef_code_reference_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_proto_coderef_code_reference_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_proto_coderef_code_reference_proto_goTypes = []interface{}{
+ (CodeReference_RepositoryType)(0), // 0: bucketeer.coderef.CodeReference.RepositoryType
+ (*CodeReference)(nil), // 1: bucketeer.coderef.CodeReference
+}
+var file_proto_coderef_code_reference_proto_depIdxs = []int32{
+ 0, // 0: bucketeer.coderef.CodeReference.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 1, // [1:1] is the sub-list for method output_type
+ 1, // [1:1] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_proto_coderef_code_reference_proto_init() }
+func file_proto_coderef_code_reference_proto_init() {
+ if File_proto_coderef_code_reference_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_coderef_code_reference_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CodeReference); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_coderef_code_reference_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 1,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_proto_coderef_code_reference_proto_goTypes,
+ DependencyIndexes: file_proto_coderef_code_reference_proto_depIdxs,
+ EnumInfos: file_proto_coderef_code_reference_proto_enumTypes,
+ MessageInfos: file_proto_coderef_code_reference_proto_msgTypes,
+ }.Build()
+ File_proto_coderef_code_reference_proto = out.File
+ file_proto_coderef_code_reference_proto_rawDesc = nil
+ file_proto_coderef_code_reference_proto_goTypes = nil
+ file_proto_coderef_code_reference_proto_depIdxs = nil
+}
diff --git a/proto/coderef/code_reference.proto b/proto/coderef/code_reference.proto
new file mode 100644
index 0000000000..ea21cde553
--- /dev/null
+++ b/proto/coderef/code_reference.proto
@@ -0,0 +1,46 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package bucketeer.coderef;
+option go_package = "github.com/bucketeer-io/bucketeer/proto/coderef";
+
+message CodeReference {
+ enum RepositoryType {
+ REPOSITORY_TYPE_UNSPECIFIED = 0;
+ GITHUB = 1;
+ GITLAB = 2;
+ BITBUCKET = 3;
+ CUSTOM = 4;
+ }
+
+ string id = 1;
+ string feature_id = 2;
+ string file_path = 3;
+ int32 line_number = 4;
+ string code_snippet = 5;
+ string content_hash = 6;
+ repeated string aliases = 7;
+ string repository_name = 8;
+ string repository_owner = 9;
+ RepositoryType repository_type = 10;
+ string repository_branch = 11;
+ string commit_hash = 12;
+ string environment_id = 13;
+ int64 created_at = 14;
+ int64 updated_at = 15;
+ // URL to view the code in the repository
+ string source_url = 16;
+}
\ No newline at end of file
diff --git a/proto/coderef/proto_descriptor.pb b/proto/coderef/proto_descriptor.pb
new file mode 100644
index 0000000000..f02e07d101
Binary files /dev/null and b/proto/coderef/proto_descriptor.pb differ
diff --git a/proto/coderef/service.pb.go b/proto/coderef/service.pb.go
new file mode 100644
index 0000000000..5b45ed0c64
--- /dev/null
+++ b/proto/coderef/service.pb.go
@@ -0,0 +1,1725 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.26.0
+// protoc v4.23.4
+// source: proto/coderef/service.proto
+
+package coderef
+
+import (
+ context "context"
+ _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"
+ _ "google.golang.org/genproto/googleapis/api/annotations"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ListCodeReferencesRequest_OrderBy int32
+
+const (
+ ListCodeReferencesRequest_DEFAULT ListCodeReferencesRequest_OrderBy = 0
+ ListCodeReferencesRequest_CREATED_AT ListCodeReferencesRequest_OrderBy = 1
+ ListCodeReferencesRequest_UPDATED_AT ListCodeReferencesRequest_OrderBy = 2
+)
+
+// Enum value maps for ListCodeReferencesRequest_OrderBy.
+var (
+ ListCodeReferencesRequest_OrderBy_name = map[int32]string{
+ 0: "DEFAULT",
+ 1: "CREATED_AT",
+ 2: "UPDATED_AT",
+ }
+ ListCodeReferencesRequest_OrderBy_value = map[string]int32{
+ "DEFAULT": 0,
+ "CREATED_AT": 1,
+ "UPDATED_AT": 2,
+ }
+)
+
+func (x ListCodeReferencesRequest_OrderBy) Enum() *ListCodeReferencesRequest_OrderBy {
+ p := new(ListCodeReferencesRequest_OrderBy)
+ *p = x
+ return p
+}
+
+func (x ListCodeReferencesRequest_OrderBy) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ListCodeReferencesRequest_OrderBy) Descriptor() protoreflect.EnumDescriptor {
+ return file_proto_coderef_service_proto_enumTypes[0].Descriptor()
+}
+
+func (ListCodeReferencesRequest_OrderBy) Type() protoreflect.EnumType {
+ return &file_proto_coderef_service_proto_enumTypes[0]
+}
+
+func (x ListCodeReferencesRequest_OrderBy) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ListCodeReferencesRequest_OrderBy.Descriptor instead.
+func (ListCodeReferencesRequest_OrderBy) EnumDescriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{2, 0}
+}
+
+type ListCodeReferencesRequest_OrderDirection int32
+
+const (
+ ListCodeReferencesRequest_ASC ListCodeReferencesRequest_OrderDirection = 0
+ ListCodeReferencesRequest_DESC ListCodeReferencesRequest_OrderDirection = 1
+)
+
+// Enum value maps for ListCodeReferencesRequest_OrderDirection.
+var (
+ ListCodeReferencesRequest_OrderDirection_name = map[int32]string{
+ 0: "ASC",
+ 1: "DESC",
+ }
+ ListCodeReferencesRequest_OrderDirection_value = map[string]int32{
+ "ASC": 0,
+ "DESC": 1,
+ }
+)
+
+func (x ListCodeReferencesRequest_OrderDirection) Enum() *ListCodeReferencesRequest_OrderDirection {
+ p := new(ListCodeReferencesRequest_OrderDirection)
+ *p = x
+ return p
+}
+
+func (x ListCodeReferencesRequest_OrderDirection) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ListCodeReferencesRequest_OrderDirection) Descriptor() protoreflect.EnumDescriptor {
+ return file_proto_coderef_service_proto_enumTypes[1].Descriptor()
+}
+
+func (ListCodeReferencesRequest_OrderDirection) Type() protoreflect.EnumType {
+ return &file_proto_coderef_service_proto_enumTypes[1]
+}
+
+func (x ListCodeReferencesRequest_OrderDirection) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ListCodeReferencesRequest_OrderDirection.Descriptor instead.
+func (ListCodeReferencesRequest_OrderDirection) EnumDescriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{2, 1}
+}
+
+type GetCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+}
+
+func (x *GetCodeReferenceRequest) Reset() {
+ *x = GetCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCodeReferenceRequest) ProtoMessage() {}
+
+func (x *GetCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*GetCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *GetCodeReferenceRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+type GetCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *GetCodeReferenceResponse) Reset() {
+ *x = GetCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCodeReferenceResponse) ProtoMessage() {}
+
+func (x *GetCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*GetCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetCodeReferenceResponse) GetCodeReference() *CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type ListCodeReferencesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ EnvironmentId string `protobuf:"bytes,1,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ FeatureId string `protobuf:"bytes,2,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ RepositoryName string `protobuf:"bytes,3,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,4,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType CodeReference_RepositoryType `protobuf:"varint,5,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,6,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ Cursor string `protobuf:"bytes,7,opt,name=cursor,proto3" json:"cursor"`
+ PageSize int64 `protobuf:"varint,8,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+ OrderBy ListCodeReferencesRequest_OrderBy `protobuf:"varint,9,opt,name=order_by,json=orderBy,proto3,enum=bucketeer.coderef.ListCodeReferencesRequest_OrderBy" json:"order_by"`
+ OrderDirection ListCodeReferencesRequest_OrderDirection `protobuf:"varint,10,opt,name=order_direction,json=orderDirection,proto3,enum=bucketeer.coderef.ListCodeReferencesRequest_OrderDirection" json:"order_direction"`
+ // File extension to filter code references (e.g., ".js", ".go", ".py")
+ FileExtension string `protobuf:"bytes,11,opt,name=file_extension,json=fileExtension,proto3" json:"file_extension"`
+}
+
+func (x *ListCodeReferencesRequest) Reset() {
+ *x = ListCodeReferencesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListCodeReferencesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListCodeReferencesRequest) ProtoMessage() {}
+
+func (x *ListCodeReferencesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListCodeReferencesRequest.ProtoReflect.Descriptor instead.
+func (*ListCodeReferencesRequest) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ListCodeReferencesRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetRepositoryType() CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *ListCodeReferencesRequest) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetCursor() string {
+ if x != nil {
+ return x.Cursor
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetPageSize() int64 {
+ if x != nil {
+ return x.PageSize
+ }
+ return 0
+}
+
+func (x *ListCodeReferencesRequest) GetOrderBy() ListCodeReferencesRequest_OrderBy {
+ if x != nil {
+ return x.OrderBy
+ }
+ return ListCodeReferencesRequest_DEFAULT
+}
+
+func (x *ListCodeReferencesRequest) GetOrderDirection() ListCodeReferencesRequest_OrderDirection {
+ if x != nil {
+ return x.OrderDirection
+ }
+ return ListCodeReferencesRequest_ASC
+}
+
+func (x *ListCodeReferencesRequest) GetFileExtension() string {
+ if x != nil {
+ return x.FileExtension
+ }
+ return ""
+}
+
+type ListCodeReferencesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReferences []*CodeReference `protobuf:"bytes,1,rep,name=code_references,json=codeReferences,proto3" json:"code_references"`
+ Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor"`
+ TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count"`
+}
+
+func (x *ListCodeReferencesResponse) Reset() {
+ *x = ListCodeReferencesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListCodeReferencesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListCodeReferencesResponse) ProtoMessage() {}
+
+func (x *ListCodeReferencesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListCodeReferencesResponse.ProtoReflect.Descriptor instead.
+func (*ListCodeReferencesResponse) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ListCodeReferencesResponse) GetCodeReferences() []*CodeReference {
+ if x != nil {
+ return x.CodeReferences
+ }
+ return nil
+}
+
+func (x *ListCodeReferencesResponse) GetCursor() string {
+ if x != nil {
+ return x.Cursor
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesResponse) GetTotalCount() int64 {
+ if x != nil {
+ return x.TotalCount
+ }
+ return 0
+}
+
+type CreateCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ FeatureId string `protobuf:"bytes,1,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ FilePath string `protobuf:"bytes,3,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,5,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,6,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,7,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryName string `protobuf:"bytes,8,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,9,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType CodeReference_RepositoryType `protobuf:"varint,10,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,11,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,12,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+}
+
+func (x *CreateCodeReferenceRequest) Reset() {
+ *x = CreateCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateCodeReferenceRequest) ProtoMessage() {}
+
+func (x *CreateCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*CreateCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *CreateCodeReferenceRequest) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *CreateCodeReferenceRequest) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryType() CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+type CreateCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *CreateCodeReferenceResponse) Reset() {
+ *x = CreateCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateCodeReferenceResponse) ProtoMessage() {}
+
+func (x *CreateCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*CreateCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *CreateCodeReferenceResponse) GetCodeReference() *CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type UpdateCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ FilePath string `protobuf:"bytes,3,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,5,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,6,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,7,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryName string `protobuf:"bytes,8,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,9,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType CodeReference_RepositoryType `protobuf:"varint,10,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,11,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,12,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+}
+
+func (x *UpdateCodeReferenceRequest) Reset() {
+ *x = UpdateCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UpdateCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateCodeReferenceRequest) ProtoMessage() {}
+
+func (x *UpdateCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UpdateCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*UpdateCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *UpdateCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *UpdateCodeReferenceRequest) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *UpdateCodeReferenceRequest) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetRepositoryType() CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *UpdateCodeReferenceRequest) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+type UpdateCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *UpdateCodeReferenceResponse) Reset() {
+ *x = UpdateCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UpdateCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateCodeReferenceResponse) ProtoMessage() {}
+
+func (x *UpdateCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UpdateCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*UpdateCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *UpdateCodeReferenceResponse) GetCodeReference() *CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type DeleteCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+}
+
+func (x *DeleteCodeReferenceRequest) Reset() {
+ *x = DeleteCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteCodeReferenceRequest) ProtoMessage() {}
+
+func (x *DeleteCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*DeleteCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *DeleteCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *DeleteCodeReferenceRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+type DeleteCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteCodeReferenceResponse) Reset() {
+ *x = DeleteCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_coderef_service_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteCodeReferenceResponse) ProtoMessage() {}
+
+func (x *DeleteCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_coderef_service_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*DeleteCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_coderef_service_proto_rawDescGZIP(), []int{9}
+}
+
+var File_proto_coderef_service_proto protoreflect.FileDescriptor
+
+var file_proto_coderef_service_proto_rawDesc = []byte{
+ 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2f,
+ 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66,
+ 0x1a, 0x22, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69,
+ 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f,
+ 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x22, 0x50, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a,
+ 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+ 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64,
+ 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xac, 0x05, 0x0a, 0x19, 0x4c, 0x69,
+ 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x27, 0x0a,
+ 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e, 0x65,
+ 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43,
+ 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72,
+ 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73,
+ 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72,
+ 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4f, 0x0a,
+ 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x34, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65,
+ 0x72, 0x65, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72,
+ 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x64,
+ 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74,
+ 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x69,
+ 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x07, 0x4f,
+ 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c,
+ 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41,
+ 0x54, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41,
+ 0x54, 0x10, 0x02, 0x22, 0x23, 0x0a, 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08,
+ 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x22, 0xa0, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73,
+ 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x63, 0x6f, 0x64, 0x65, 0x5f,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64,
+ 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f,
+ 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xfc, 0x03, 0x0a, 0x1a,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76,
+ 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
+ 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a,
+ 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21,
+ 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65,
+ 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73,
+ 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18,
+ 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x27,
+ 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e,
+ 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11,
+ 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63,
+ 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x66, 0x0a, 0x1b, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6f, 0x64,
+ 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f,
+ 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x22, 0xed, 0x03, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64,
+ 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
+ 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
+ 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65,
+ 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73,
+ 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+ 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07,
+ 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61,
+ 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+ 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77,
+ 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63,
+ 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68,
+ 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61,
+ 0x73, 0x68, 0x22, 0x66, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f,
+ 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64,
+ 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x53, 0x0a, 0x1a, 0x44, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22,
+ 0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x95,
+ 0x1e, 0x0a, 0x14, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xf7, 0x05, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43,
+ 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66,
+ 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x47, 0x65, 0x74,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, 0x05, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18,
+ 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xe5, 0x04, 0x0a, 0x0e, 0x43, 0x6f,
+ 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x03, 0x47, 0x65,
+ 0x74, 0x1a, 0x1b, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x2a, 0x19,
+ 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30,
+ 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61,
+ 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
+ 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20,
+ 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61,
+ 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c,
+ 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d,
+ 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22,
+ 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a,
+ 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xa9, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x33, 0x12, 0xa1, 0x01,
+ 0x0a, 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,
+ 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22,
+ 0x3a, 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20,
+ 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22,
+ 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20,
+ 0x7d, 0x12, 0xe0, 0x04, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x4c, 0x69, 0x73,
+ 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43,
+ 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13,
+ 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x92, 0x41, 0xcd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x2d, 0x4c,
+ 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+ 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x2a, 0x1a, 0x77, 0x65,
+ 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30,
+ 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69,
+ 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72,
+ 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20,
+ 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a,
+ 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28,
+ 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a,
+ 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20,
+ 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
+ 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20,
+ 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0xb0, 0x06, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43,
+ 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66,
+ 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb9, 0x05, 0x82, 0xd3,
+ 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x97, 0x05,
+ 0x0a, 0x0e, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x47, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65,
+ 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x2e, 0x2a, 0x1c, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a,
+ 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75,
+ 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56,
+ 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73,
+ 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c,
+ 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22,
+ 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa,
+ 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
+ 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e,
+ 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
+ 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20,
+ 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68,
+ 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74,
+ 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xa9, 0x01, 0x0a, 0x03,
+ 0x34, 0x30, 0x33, 0x12, 0xa1, 0x01, 0x0a, 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20,
+ 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65,
+ 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,
+ 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
+ 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20,
+ 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,
+ 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0xbb, 0x06, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12,
+ 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65,
+ 0x72, 0x65, 0x66, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72,
+ 0x65, 0x66, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4,
+ 0x05, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x32, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64,
+ 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x9d, 0x05, 0x0a, 0x0e, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x1a, 0x4d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20,
+ 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a,
+ 0x1c, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0xb4, 0x01,
+ 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e,
+ 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76,
+ 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10,
+ 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e,
+ 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22,
+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20,
+ 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a,
+ 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16,
+ 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63,
+ 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
+ 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69,
+ 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xa9, 0x01, 0x0a, 0x03, 0x34, 0x30,
+ 0x33, 0x12, 0xa1, 0x01, 0x0a, 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x64, 0x6f,
+ 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72, 0x6d,
+ 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x12, 0x16,
+ 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20, 0x22, 0x63,
+ 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
+ 0x7a, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0xae, 0x06, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65,
+ 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66,
+ 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x05, 0x82,
+ 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92,
+ 0x41, 0x93, 0x05, 0x0a, 0x0e, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x12, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x43, 0x44, 0x65, 0x6c,
+ 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e,
+ 0x2a, 0x1c, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0xb4,
+ 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72,
+ 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61,
+ 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a,
+ 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f,
+ 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20,
+ 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01,
+ 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65,
+ 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61,
+ 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xa9, 0x01, 0x0a, 0x03, 0x34,
+ 0x30, 0x33, 0x12, 0xa1, 0x01, 0x0a, 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x64,
+ 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72,
+ 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+ 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22,
+ 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69,
+ 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x33,
+}
+
+var (
+ file_proto_coderef_service_proto_rawDescOnce sync.Once
+ file_proto_coderef_service_proto_rawDescData = file_proto_coderef_service_proto_rawDesc
+)
+
+func file_proto_coderef_service_proto_rawDescGZIP() []byte {
+ file_proto_coderef_service_proto_rawDescOnce.Do(func() {
+ file_proto_coderef_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_coderef_service_proto_rawDescData)
+ })
+ return file_proto_coderef_service_proto_rawDescData
+}
+
+var file_proto_coderef_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_proto_coderef_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_proto_coderef_service_proto_goTypes = []interface{}{
+ (ListCodeReferencesRequest_OrderBy)(0), // 0: bucketeer.coderef.ListCodeReferencesRequest.OrderBy
+ (ListCodeReferencesRequest_OrderDirection)(0), // 1: bucketeer.coderef.ListCodeReferencesRequest.OrderDirection
+ (*GetCodeReferenceRequest)(nil), // 2: bucketeer.coderef.GetCodeReferenceRequest
+ (*GetCodeReferenceResponse)(nil), // 3: bucketeer.coderef.GetCodeReferenceResponse
+ (*ListCodeReferencesRequest)(nil), // 4: bucketeer.coderef.ListCodeReferencesRequest
+ (*ListCodeReferencesResponse)(nil), // 5: bucketeer.coderef.ListCodeReferencesResponse
+ (*CreateCodeReferenceRequest)(nil), // 6: bucketeer.coderef.CreateCodeReferenceRequest
+ (*CreateCodeReferenceResponse)(nil), // 7: bucketeer.coderef.CreateCodeReferenceResponse
+ (*UpdateCodeReferenceRequest)(nil), // 8: bucketeer.coderef.UpdateCodeReferenceRequest
+ (*UpdateCodeReferenceResponse)(nil), // 9: bucketeer.coderef.UpdateCodeReferenceResponse
+ (*DeleteCodeReferenceRequest)(nil), // 10: bucketeer.coderef.DeleteCodeReferenceRequest
+ (*DeleteCodeReferenceResponse)(nil), // 11: bucketeer.coderef.DeleteCodeReferenceResponse
+ (*CodeReference)(nil), // 12: bucketeer.coderef.CodeReference
+ (CodeReference_RepositoryType)(0), // 13: bucketeer.coderef.CodeReference.RepositoryType
+}
+var file_proto_coderef_service_proto_depIdxs = []int32{
+ 12, // 0: bucketeer.coderef.GetCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 13, // 1: bucketeer.coderef.ListCodeReferencesRequest.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 0, // 2: bucketeer.coderef.ListCodeReferencesRequest.order_by:type_name -> bucketeer.coderef.ListCodeReferencesRequest.OrderBy
+ 1, // 3: bucketeer.coderef.ListCodeReferencesRequest.order_direction:type_name -> bucketeer.coderef.ListCodeReferencesRequest.OrderDirection
+ 12, // 4: bucketeer.coderef.ListCodeReferencesResponse.code_references:type_name -> bucketeer.coderef.CodeReference
+ 13, // 5: bucketeer.coderef.CreateCodeReferenceRequest.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 12, // 6: bucketeer.coderef.CreateCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 13, // 7: bucketeer.coderef.UpdateCodeReferenceRequest.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 12, // 8: bucketeer.coderef.UpdateCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 2, // 9: bucketeer.coderef.CodeReferenceService.GetCodeReference:input_type -> bucketeer.coderef.GetCodeReferenceRequest
+ 4, // 10: bucketeer.coderef.CodeReferenceService.ListCodeReferences:input_type -> bucketeer.coderef.ListCodeReferencesRequest
+ 6, // 11: bucketeer.coderef.CodeReferenceService.CreateCodeReference:input_type -> bucketeer.coderef.CreateCodeReferenceRequest
+ 8, // 12: bucketeer.coderef.CodeReferenceService.UpdateCodeReference:input_type -> bucketeer.coderef.UpdateCodeReferenceRequest
+ 10, // 13: bucketeer.coderef.CodeReferenceService.DeleteCodeReference:input_type -> bucketeer.coderef.DeleteCodeReferenceRequest
+ 3, // 14: bucketeer.coderef.CodeReferenceService.GetCodeReference:output_type -> bucketeer.coderef.GetCodeReferenceResponse
+ 5, // 15: bucketeer.coderef.CodeReferenceService.ListCodeReferences:output_type -> bucketeer.coderef.ListCodeReferencesResponse
+ 7, // 16: bucketeer.coderef.CodeReferenceService.CreateCodeReference:output_type -> bucketeer.coderef.CreateCodeReferenceResponse
+ 9, // 17: bucketeer.coderef.CodeReferenceService.UpdateCodeReference:output_type -> bucketeer.coderef.UpdateCodeReferenceResponse
+ 11, // 18: bucketeer.coderef.CodeReferenceService.DeleteCodeReference:output_type -> bucketeer.coderef.DeleteCodeReferenceResponse
+ 14, // [14:19] is the sub-list for method output_type
+ 9, // [9:14] is the sub-list for method input_type
+ 9, // [9:9] is the sub-list for extension type_name
+ 9, // [9:9] is the sub-list for extension extendee
+ 0, // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_proto_coderef_service_proto_init() }
+func file_proto_coderef_service_proto_init() {
+ if File_proto_coderef_service_proto != nil {
+ return
+ }
+ file_proto_coderef_code_reference_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_proto_coderef_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListCodeReferencesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListCodeReferencesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UpdateCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UpdateCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_coderef_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_coderef_service_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 10,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_coderef_service_proto_goTypes,
+ DependencyIndexes: file_proto_coderef_service_proto_depIdxs,
+ EnumInfos: file_proto_coderef_service_proto_enumTypes,
+ MessageInfos: file_proto_coderef_service_proto_msgTypes,
+ }.Build()
+ File_proto_coderef_service_proto = out.File
+ file_proto_coderef_service_proto_rawDesc = nil
+ file_proto_coderef_service_proto_goTypes = nil
+ file_proto_coderef_service_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CodeReferenceServiceClient is the client API for CodeReferenceService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CodeReferenceServiceClient interface {
+ GetCodeReference(ctx context.Context, in *GetCodeReferenceRequest, opts ...grpc.CallOption) (*GetCodeReferenceResponse, error)
+ ListCodeReferences(ctx context.Context, in *ListCodeReferencesRequest, opts ...grpc.CallOption) (*ListCodeReferencesResponse, error)
+ CreateCodeReference(ctx context.Context, in *CreateCodeReferenceRequest, opts ...grpc.CallOption) (*CreateCodeReferenceResponse, error)
+ UpdateCodeReference(ctx context.Context, in *UpdateCodeReferenceRequest, opts ...grpc.CallOption) (*UpdateCodeReferenceResponse, error)
+ DeleteCodeReference(ctx context.Context, in *DeleteCodeReferenceRequest, opts ...grpc.CallOption) (*DeleteCodeReferenceResponse, error)
+}
+
+type codeReferenceServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewCodeReferenceServiceClient(cc grpc.ClientConnInterface) CodeReferenceServiceClient {
+ return &codeReferenceServiceClient{cc}
+}
+
+func (c *codeReferenceServiceClient) GetCodeReference(ctx context.Context, in *GetCodeReferenceRequest, opts ...grpc.CallOption) (*GetCodeReferenceResponse, error) {
+ out := new(GetCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.coderef.CodeReferenceService/GetCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *codeReferenceServiceClient) ListCodeReferences(ctx context.Context, in *ListCodeReferencesRequest, opts ...grpc.CallOption) (*ListCodeReferencesResponse, error) {
+ out := new(ListCodeReferencesResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.coderef.CodeReferenceService/ListCodeReferences", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *codeReferenceServiceClient) CreateCodeReference(ctx context.Context, in *CreateCodeReferenceRequest, opts ...grpc.CallOption) (*CreateCodeReferenceResponse, error) {
+ out := new(CreateCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.coderef.CodeReferenceService/CreateCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *codeReferenceServiceClient) UpdateCodeReference(ctx context.Context, in *UpdateCodeReferenceRequest, opts ...grpc.CallOption) (*UpdateCodeReferenceResponse, error) {
+ out := new(UpdateCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.coderef.CodeReferenceService/UpdateCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *codeReferenceServiceClient) DeleteCodeReference(ctx context.Context, in *DeleteCodeReferenceRequest, opts ...grpc.CallOption) (*DeleteCodeReferenceResponse, error) {
+ out := new(DeleteCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.coderef.CodeReferenceService/DeleteCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// CodeReferenceServiceServer is the server API for CodeReferenceService service.
+type CodeReferenceServiceServer interface {
+ GetCodeReference(context.Context, *GetCodeReferenceRequest) (*GetCodeReferenceResponse, error)
+ ListCodeReferences(context.Context, *ListCodeReferencesRequest) (*ListCodeReferencesResponse, error)
+ CreateCodeReference(context.Context, *CreateCodeReferenceRequest) (*CreateCodeReferenceResponse, error)
+ UpdateCodeReference(context.Context, *UpdateCodeReferenceRequest) (*UpdateCodeReferenceResponse, error)
+ DeleteCodeReference(context.Context, *DeleteCodeReferenceRequest) (*DeleteCodeReferenceResponse, error)
+}
+
+// UnimplementedCodeReferenceServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCodeReferenceServiceServer struct {
+}
+
+func (*UnimplementedCodeReferenceServiceServer) GetCodeReference(context.Context, *GetCodeReferenceRequest) (*GetCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetCodeReference not implemented")
+}
+func (*UnimplementedCodeReferenceServiceServer) ListCodeReferences(context.Context, *ListCodeReferencesRequest) (*ListCodeReferencesResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListCodeReferences not implemented")
+}
+func (*UnimplementedCodeReferenceServiceServer) CreateCodeReference(context.Context, *CreateCodeReferenceRequest) (*CreateCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method CreateCodeReference not implemented")
+}
+func (*UnimplementedCodeReferenceServiceServer) UpdateCodeReference(context.Context, *UpdateCodeReferenceRequest) (*UpdateCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UpdateCodeReference not implemented")
+}
+func (*UnimplementedCodeReferenceServiceServer) DeleteCodeReference(context.Context, *DeleteCodeReferenceRequest) (*DeleteCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteCodeReference not implemented")
+}
+
+func RegisterCodeReferenceServiceServer(s *grpc.Server, srv CodeReferenceServiceServer) {
+ s.RegisterService(&_CodeReferenceService_serviceDesc, srv)
+}
+
+func _CodeReferenceService_GetCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CodeReferenceServiceServer).GetCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.coderef.CodeReferenceService/GetCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CodeReferenceServiceServer).GetCodeReference(ctx, req.(*GetCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _CodeReferenceService_ListCodeReferences_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListCodeReferencesRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CodeReferenceServiceServer).ListCodeReferences(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.coderef.CodeReferenceService/ListCodeReferences",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CodeReferenceServiceServer).ListCodeReferences(ctx, req.(*ListCodeReferencesRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _CodeReferenceService_CreateCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CreateCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CodeReferenceServiceServer).CreateCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.coderef.CodeReferenceService/CreateCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CodeReferenceServiceServer).CreateCodeReference(ctx, req.(*CreateCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _CodeReferenceService_UpdateCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpdateCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CodeReferenceServiceServer).UpdateCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.coderef.CodeReferenceService/UpdateCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CodeReferenceServiceServer).UpdateCodeReference(ctx, req.(*UpdateCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _CodeReferenceService_DeleteCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DeleteCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CodeReferenceServiceServer).DeleteCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.coderef.CodeReferenceService/DeleteCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CodeReferenceServiceServer).DeleteCodeReference(ctx, req.(*DeleteCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+var _CodeReferenceService_serviceDesc = grpc.ServiceDesc{
+ ServiceName: "bucketeer.coderef.CodeReferenceService",
+ HandlerType: (*CodeReferenceServiceServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "GetCodeReference",
+ Handler: _CodeReferenceService_GetCodeReference_Handler,
+ },
+ {
+ MethodName: "ListCodeReferences",
+ Handler: _CodeReferenceService_ListCodeReferences_Handler,
+ },
+ {
+ MethodName: "CreateCodeReference",
+ Handler: _CodeReferenceService_CreateCodeReference_Handler,
+ },
+ {
+ MethodName: "UpdateCodeReference",
+ Handler: _CodeReferenceService_UpdateCodeReference_Handler,
+ },
+ {
+ MethodName: "DeleteCodeReference",
+ Handler: _CodeReferenceService_DeleteCodeReference_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "proto/coderef/service.proto",
+}
diff --git a/proto/coderef/service.proto b/proto/coderef/service.proto
new file mode 100644
index 0000000000..81aad4f5b7
--- /dev/null
+++ b/proto/coderef/service.proto
@@ -0,0 +1,325 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package bucketeer.coderef;
+option go_package = "github.com/bucketeer-io/bucketeer/proto/coderef";
+
+import "proto/coderef/code_reference.proto";
+import "google/api/annotations.proto";
+import "protoc-gen-openapiv2/options/annotations.proto";
+
+message GetCodeReferenceRequest {
+ string id = 1;
+ string environment_id = 2;
+}
+
+message GetCodeReferenceResponse {
+ CodeReference code_reference = 1;
+}
+
+message ListCodeReferencesRequest {
+ enum OrderBy {
+ DEFAULT = 0;
+ CREATED_AT = 1;
+ UPDATED_AT = 2;
+ }
+ enum OrderDirection {
+ ASC = 0;
+ DESC = 1;
+ }
+ string environment_id = 1;
+ string feature_id = 2;
+ string repository_name = 3;
+ string repository_owner = 4;
+ CodeReference.RepositoryType repository_type = 5;
+ string repository_branch = 6;
+ string cursor = 7;
+ int64 page_size = 8;
+ OrderBy order_by = 9;
+ OrderDirection order_direction = 10;
+ // File extension to filter code references (e.g., ".js", ".go", ".py")
+ string file_extension = 11;
+}
+
+message ListCodeReferencesResponse {
+ repeated CodeReference code_references = 1;
+ string cursor = 2;
+ int64 total_count = 3;
+}
+
+message CreateCodeReferenceRequest {
+ string feature_id = 1;
+ string environment_id = 2;
+ string file_path = 3;
+ int32 line_number = 4;
+ string code_snippet = 5;
+ string content_hash = 6;
+ repeated string aliases = 7;
+ string repository_name = 8;
+ string repository_owner = 9;
+ CodeReference.RepositoryType repository_type = 10;
+ string repository_branch = 11;
+ string commit_hash = 12;
+}
+
+message CreateCodeReferenceResponse {
+ CodeReference code_reference = 1;
+}
+
+message UpdateCodeReferenceRequest {
+ string id = 1;
+ string environment_id = 2;
+ string file_path = 3;
+ int32 line_number = 4;
+ string code_snippet = 5;
+ string content_hash = 6;
+ repeated string aliases = 7;
+ string repository_name = 8;
+ string repository_owner = 9;
+ CodeReference.RepositoryType repository_type = 10;
+ string repository_branch = 11;
+ string commit_hash = 12;
+}
+
+message UpdateCodeReferenceResponse {
+ CodeReference code_reference = 1;
+}
+
+message DeleteCodeReferenceRequest {
+ string id = 1;
+ string environment_id = 2;
+}
+
+message DeleteCodeReferenceResponse {}
+
+service CodeReferenceService {
+ rpc GetCodeReference(GetCodeReferenceRequest)
+ returns (GetCodeReferenceResponse) {
+ option (google.api.http) = {
+ get: "/v1/code_references/{id}"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Get",
+ description: "Get a code reference by ID.",
+ tags: "Code Reference",
+ operation_id: "web.v1.code_reference.get",
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "403"
+ value: {
+ description: "Request does not have permission to access the resource."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 7, "message": "not authorized", "details": [] }'
+ }
+ }
+ }
+ };
+ }
+ rpc ListCodeReferences(ListCodeReferencesRequest)
+ returns (ListCodeReferencesResponse) {
+ option (google.api.http) = {
+ get: "/v1/code_references"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "List",
+ description: "List code references with optional filtering.",
+ tags: "Code Reference",
+ operation_id: "web.v1.code_reference.list",
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
+ rpc CreateCodeReference(CreateCodeReferenceRequest)
+ returns (CreateCodeReferenceResponse) {
+ option (google.api.http) = {
+ post: "/v1/code_references"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Create",
+ description: "Create a new code reference. To call this API, you need a `WRITE` role.",
+ tags: "Code Reference",
+ operation_id: "web.v1.code_reference.create",
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "403"
+ value: {
+ description: "Request does not have permission to access the resource."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 7, "message": "not authorized", "details": [] }'
+ }
+ }
+ }
+ };
+ }
+ rpc UpdateCodeReference(UpdateCodeReferenceRequest)
+ returns (UpdateCodeReferenceResponse) {
+ option (google.api.http) = {
+ patch: "/v1/code_references/{id}"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Update",
+ description: "Update an existing code reference. To call this API, you need a `WRITE` role.",
+ tags: "Code Reference",
+ operation_id: "web.v1.code_reference.update",
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "403"
+ value: {
+ description: "Request does not have permission to access the resource."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 7, "message": "not authorized", "details": [] }'
+ }
+ }
+ }
+ };
+ }
+ rpc DeleteCodeReference(DeleteCodeReferenceRequest)
+ returns (DeleteCodeReferenceResponse) {
+ option (google.api.http) = {
+ delete: "/v1/code_references/{id}"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Delete",
+ description: "Delete a code reference. To call this API, you need a `WRITE` role.",
+ tags: "Code Reference",
+ operation_id: "web.v1.code_reference.delete",
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "403"
+ value: {
+ description: "Request does not have permission to access the resource."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 7, "message": "not authorized", "details": [] }'
+ }
+ }
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/proto/event/domain/event.pb.go b/proto/event/domain/event.pb.go
index 5d1a62f7d8..68b6538db4 100644
--- a/proto/event/domain/event.pb.go
+++ b/proto/event/domain/event.pb.go
@@ -23,6 +23,8 @@ package domain
import (
account "github.com/bucketeer-io/bucketeer/proto/account"
autoops "github.com/bucketeer-io/bucketeer/proto/autoops"
+ coderef "github.com/bucketeer-io/bucketeer/proto/coderef"
+ experiment "github.com/bucketeer-io/bucketeer/proto/experiment"
feature "github.com/bucketeer-io/bucketeer/proto/feature"
notification "github.com/bucketeer-io/bucketeer/proto/notification"
tag "github.com/bucketeer-io/bucketeer/proto/tag"
@@ -61,6 +63,7 @@ const (
Event_ORGANIZATION Event_EntityType = 15
Event_FLAG_TRIGGER Event_EntityType = 16
Event_TAG Event_EntityType = 17
+ Event_CODEREF Event_EntityType = 18
)
// Enum value maps for Event_EntityType.
@@ -83,6 +86,7 @@ var (
15: "ORGANIZATION",
16: "FLAG_TRIGGER",
17: "TAG",
+ 18: "CODEREF",
}
Event_EntityType_value = map[string]int32{
"FEATURE": 0,
@@ -102,6 +106,7 @@ var (
"ORGANIZATION": 15,
"FLAG_TRIGGER": 16,
"TAG": 17,
+ "CODEREF": 18,
}
)
@@ -179,6 +184,7 @@ const (
Event_GOAL_DESCRIPTION_CHANGED Event_Type = 102
Event_GOAL_DELETED Event_Type = 103
Event_GOAL_ARCHIVED Event_Type = 104
+ Event_GOAL_UPDATED Event_Type = 105
Event_EXPERIMENT_CREATED Event_Type = 200
Event_EXPERIMENT_STOPPED Event_Type = 201
Event_EXPERIMENT_START_AT_CHANGED Event_Type = 202
@@ -318,6 +324,9 @@ const (
Event_FLAG_TRIGGER_USAGE_UPDATED Event_Type = 1607
Event_TAG_CREATED Event_Type = 1701
Event_TAG_DELETED Event_Type = 1702
+ Event_CODE_REFERENCE_CREATED Event_Type = 1800
+ Event_CODE_REFERENCE_UPDATED Event_Type = 1801
+ Event_CODE_REFERENCE_DELETED Event_Type = 1802
)
// Enum value maps for Event_Type.
@@ -367,6 +376,7 @@ var (
102: "GOAL_DESCRIPTION_CHANGED",
103: "GOAL_DELETED",
104: "GOAL_ARCHIVED",
+ 105: "GOAL_UPDATED",
200: "EXPERIMENT_CREATED",
201: "EXPERIMENT_STOPPED",
202: "EXPERIMENT_START_AT_CHANGED",
@@ -497,6 +507,9 @@ var (
1607: "FLAG_TRIGGER_USAGE_UPDATED",
1701: "TAG_CREATED",
1702: "TAG_DELETED",
+ 1800: "CODE_REFERENCE_CREATED",
+ 1801: "CODE_REFERENCE_UPDATED",
+ 1802: "CODE_REFERENCE_DELETED",
}
Event_Type_value = map[string]int32{
"UNKNOWN": 0,
@@ -543,6 +556,7 @@ var (
"GOAL_DESCRIPTION_CHANGED": 102,
"GOAL_DELETED": 103,
"GOAL_ARCHIVED": 104,
+ "GOAL_UPDATED": 105,
"EXPERIMENT_CREATED": 200,
"EXPERIMENT_STOPPED": 201,
"EXPERIMENT_START_AT_CHANGED": 202,
@@ -673,6 +687,9 @@ var (
"FLAG_TRIGGER_USAGE_UPDATED": 1607,
"TAG_CREATED": 1701,
"TAG_DELETED": 1702,
+ "CODE_REFERENCE_CREATED": 1800,
+ "CODE_REFERENCE_UPDATED": 1801,
+ "CODE_REFERENCE_DELETED": 1802,
}
)
@@ -3257,12 +3274,13 @@ type GoalCreatedEvent struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
- Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
- Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
- Deleted bool `protobuf:"varint,4,opt,name=deleted,proto3" json:"deleted"`
- CreatedAt int64 `protobuf:"varint,5,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
- UpdatedAt int64 `protobuf:"varint,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
+ Deleted bool `protobuf:"varint,4,opt,name=deleted,proto3" json:"deleted"`
+ CreatedAt int64 `protobuf:"varint,5,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+ UpdatedAt int64 `protobuf:"varint,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+ ConnectionType experiment.Goal_ConnectionType `protobuf:"varint,7,opt,name=connection_type,json=connectionType,proto3,enum=bucketeer.experiment.Goal_ConnectionType" json:"connection_type"`
}
func (x *GoalCreatedEvent) Reset() {
@@ -3339,6 +3357,76 @@ func (x *GoalCreatedEvent) GetUpdatedAt() int64 {
return 0
}
+func (x *GoalCreatedEvent) GetConnectionType() experiment.Goal_ConnectionType {
+ if x != nil {
+ return x.ConnectionType
+ }
+ return experiment.Goal_UNKNOWN
+}
+
+type GoalUpdatedEvent struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Name *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+ Description *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
+}
+
+func (x *GoalUpdatedEvent) Reset() {
+ *x = GoalUpdatedEvent{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_event_domain_event_proto_msgTypes[41]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GoalUpdatedEvent) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GoalUpdatedEvent) ProtoMessage() {}
+
+func (x *GoalUpdatedEvent) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_event_domain_event_proto_msgTypes[41]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GoalUpdatedEvent.ProtoReflect.Descriptor instead.
+func (*GoalUpdatedEvent) Descriptor() ([]byte, []int) {
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *GoalUpdatedEvent) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *GoalUpdatedEvent) GetName() *wrapperspb.StringValue {
+ if x != nil {
+ return x.Name
+ }
+ return nil
+}
+
+func (x *GoalUpdatedEvent) GetDescription() *wrapperspb.StringValue {
+ if x != nil {
+ return x.Description
+ }
+ return nil
+}
+
type GoalRenamedEvent struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -3351,7 +3439,7 @@ type GoalRenamedEvent struct {
func (x *GoalRenamedEvent) Reset() {
*x = GoalRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[41]
+ mi := &file_proto_event_domain_event_proto_msgTypes[42]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3364,7 +3452,7 @@ func (x *GoalRenamedEvent) String() string {
func (*GoalRenamedEvent) ProtoMessage() {}
func (x *GoalRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[41]
+ mi := &file_proto_event_domain_event_proto_msgTypes[42]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3377,7 +3465,7 @@ func (x *GoalRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use GoalRenamedEvent.ProtoReflect.Descriptor instead.
func (*GoalRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{41}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{42}
}
func (x *GoalRenamedEvent) GetId() string {
@@ -3406,7 +3494,7 @@ type GoalDescriptionChangedEvent struct {
func (x *GoalDescriptionChangedEvent) Reset() {
*x = GoalDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[42]
+ mi := &file_proto_event_domain_event_proto_msgTypes[43]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3419,7 +3507,7 @@ func (x *GoalDescriptionChangedEvent) String() string {
func (*GoalDescriptionChangedEvent) ProtoMessage() {}
func (x *GoalDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[42]
+ mi := &file_proto_event_domain_event_proto_msgTypes[43]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3432,7 +3520,7 @@ func (x *GoalDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use GoalDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*GoalDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{42}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{43}
}
func (x *GoalDescriptionChangedEvent) GetId() string {
@@ -3460,7 +3548,7 @@ type GoalArchivedEvent struct {
func (x *GoalArchivedEvent) Reset() {
*x = GoalArchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[43]
+ mi := &file_proto_event_domain_event_proto_msgTypes[44]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3473,7 +3561,7 @@ func (x *GoalArchivedEvent) String() string {
func (*GoalArchivedEvent) ProtoMessage() {}
func (x *GoalArchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[43]
+ mi := &file_proto_event_domain_event_proto_msgTypes[44]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3486,7 +3574,7 @@ func (x *GoalArchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use GoalArchivedEvent.ProtoReflect.Descriptor instead.
func (*GoalArchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{43}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{44}
}
func (x *GoalArchivedEvent) GetId() string {
@@ -3507,7 +3595,7 @@ type GoalDeletedEvent struct {
func (x *GoalDeletedEvent) Reset() {
*x = GoalDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[44]
+ mi := &file_proto_event_domain_event_proto_msgTypes[45]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3520,7 +3608,7 @@ func (x *GoalDeletedEvent) String() string {
func (*GoalDeletedEvent) ProtoMessage() {}
func (x *GoalDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[44]
+ mi := &file_proto_event_domain_event_proto_msgTypes[45]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3533,7 +3621,7 @@ func (x *GoalDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use GoalDeletedEvent.ProtoReflect.Descriptor instead.
func (*GoalDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{44}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{45}
}
func (x *GoalDeletedEvent) GetId() string {
@@ -3569,7 +3657,7 @@ type ExperimentCreatedEvent struct {
func (x *ExperimentCreatedEvent) Reset() {
*x = ExperimentCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[45]
+ mi := &file_proto_event_domain_event_proto_msgTypes[46]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3582,7 +3670,7 @@ func (x *ExperimentCreatedEvent) String() string {
func (*ExperimentCreatedEvent) ProtoMessage() {}
func (x *ExperimentCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[45]
+ mi := &file_proto_event_domain_event_proto_msgTypes[46]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3595,7 +3683,7 @@ func (x *ExperimentCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentCreatedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{45}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{46}
}
func (x *ExperimentCreatedEvent) GetId() string {
@@ -3716,7 +3804,7 @@ type ExperimentStoppedEvent struct {
func (x *ExperimentStoppedEvent) Reset() {
*x = ExperimentStoppedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[46]
+ mi := &file_proto_event_domain_event_proto_msgTypes[47]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3729,7 +3817,7 @@ func (x *ExperimentStoppedEvent) String() string {
func (*ExperimentStoppedEvent) ProtoMessage() {}
func (x *ExperimentStoppedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[46]
+ mi := &file_proto_event_domain_event_proto_msgTypes[47]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3742,7 +3830,7 @@ func (x *ExperimentStoppedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentStoppedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentStoppedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{46}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{47}
}
func (x *ExperimentStoppedEvent) GetId() string {
@@ -3770,7 +3858,7 @@ type ExperimentArchivedEvent struct {
func (x *ExperimentArchivedEvent) Reset() {
*x = ExperimentArchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[47]
+ mi := &file_proto_event_domain_event_proto_msgTypes[48]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3783,7 +3871,7 @@ func (x *ExperimentArchivedEvent) String() string {
func (*ExperimentArchivedEvent) ProtoMessage() {}
func (x *ExperimentArchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[47]
+ mi := &file_proto_event_domain_event_proto_msgTypes[48]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3796,7 +3884,7 @@ func (x *ExperimentArchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentArchivedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentArchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{47}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{48}
}
func (x *ExperimentArchivedEvent) GetId() string {
@@ -3817,7 +3905,7 @@ type ExperimentDeletedEvent struct {
func (x *ExperimentDeletedEvent) Reset() {
*x = ExperimentDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[48]
+ mi := &file_proto_event_domain_event_proto_msgTypes[49]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3830,7 +3918,7 @@ func (x *ExperimentDeletedEvent) String() string {
func (*ExperimentDeletedEvent) ProtoMessage() {}
func (x *ExperimentDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[48]
+ mi := &file_proto_event_domain_event_proto_msgTypes[49]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3843,7 +3931,7 @@ func (x *ExperimentDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentDeletedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{48}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{49}
}
func (x *ExperimentDeletedEvent) GetId() string {
@@ -3865,7 +3953,7 @@ type ExperimentStartAtChangedEvent struct {
func (x *ExperimentStartAtChangedEvent) Reset() {
*x = ExperimentStartAtChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[49]
+ mi := &file_proto_event_domain_event_proto_msgTypes[50]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3878,7 +3966,7 @@ func (x *ExperimentStartAtChangedEvent) String() string {
func (*ExperimentStartAtChangedEvent) ProtoMessage() {}
func (x *ExperimentStartAtChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[49]
+ mi := &file_proto_event_domain_event_proto_msgTypes[50]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3891,7 +3979,7 @@ func (x *ExperimentStartAtChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentStartAtChangedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentStartAtChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{49}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{50}
}
func (x *ExperimentStartAtChangedEvent) GetId() string {
@@ -3920,7 +4008,7 @@ type ExperimentStopAtChangedEvent struct {
func (x *ExperimentStopAtChangedEvent) Reset() {
*x = ExperimentStopAtChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[50]
+ mi := &file_proto_event_domain_event_proto_msgTypes[51]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3933,7 +4021,7 @@ func (x *ExperimentStopAtChangedEvent) String() string {
func (*ExperimentStopAtChangedEvent) ProtoMessage() {}
func (x *ExperimentStopAtChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[50]
+ mi := &file_proto_event_domain_event_proto_msgTypes[51]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3946,7 +4034,7 @@ func (x *ExperimentStopAtChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentStopAtChangedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentStopAtChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{50}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{51}
}
func (x *ExperimentStopAtChangedEvent) GetId() string {
@@ -3976,7 +4064,7 @@ type ExperimentPeriodChangedEvent struct {
func (x *ExperimentPeriodChangedEvent) Reset() {
*x = ExperimentPeriodChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[51]
+ mi := &file_proto_event_domain_event_proto_msgTypes[52]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3989,7 +4077,7 @@ func (x *ExperimentPeriodChangedEvent) String() string {
func (*ExperimentPeriodChangedEvent) ProtoMessage() {}
func (x *ExperimentPeriodChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[51]
+ mi := &file_proto_event_domain_event_proto_msgTypes[52]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4002,7 +4090,7 @@ func (x *ExperimentPeriodChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentPeriodChangedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentPeriodChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{51}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{52}
}
func (x *ExperimentPeriodChangedEvent) GetId() string {
@@ -4038,7 +4126,7 @@ type ExperimentNameChangedEvent struct {
func (x *ExperimentNameChangedEvent) Reset() {
*x = ExperimentNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[52]
+ mi := &file_proto_event_domain_event_proto_msgTypes[53]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4051,7 +4139,7 @@ func (x *ExperimentNameChangedEvent) String() string {
func (*ExperimentNameChangedEvent) ProtoMessage() {}
func (x *ExperimentNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[52]
+ mi := &file_proto_event_domain_event_proto_msgTypes[53]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4064,7 +4152,7 @@ func (x *ExperimentNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentNameChangedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{52}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{53}
}
func (x *ExperimentNameChangedEvent) GetId() string {
@@ -4093,7 +4181,7 @@ type ExperimentDescriptionChangedEvent struct {
func (x *ExperimentDescriptionChangedEvent) Reset() {
*x = ExperimentDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[53]
+ mi := &file_proto_event_domain_event_proto_msgTypes[54]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4106,7 +4194,7 @@ func (x *ExperimentDescriptionChangedEvent) String() string {
func (*ExperimentDescriptionChangedEvent) ProtoMessage() {}
func (x *ExperimentDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[53]
+ mi := &file_proto_event_domain_event_proto_msgTypes[54]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4119,7 +4207,7 @@ func (x *ExperimentDescriptionChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use ExperimentDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{53}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{54}
}
func (x *ExperimentDescriptionChangedEvent) GetId() string {
@@ -4145,7 +4233,7 @@ type ExperimentStartedEvent struct {
func (x *ExperimentStartedEvent) Reset() {
*x = ExperimentStartedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[54]
+ mi := &file_proto_event_domain_event_proto_msgTypes[55]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4158,7 +4246,7 @@ func (x *ExperimentStartedEvent) String() string {
func (*ExperimentStartedEvent) ProtoMessage() {}
func (x *ExperimentStartedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[54]
+ mi := &file_proto_event_domain_event_proto_msgTypes[55]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4171,7 +4259,7 @@ func (x *ExperimentStartedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentStartedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentStartedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{54}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{55}
}
type ExperimentFinishedEvent struct {
@@ -4183,7 +4271,7 @@ type ExperimentFinishedEvent struct {
func (x *ExperimentFinishedEvent) Reset() {
*x = ExperimentFinishedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[55]
+ mi := &file_proto_event_domain_event_proto_msgTypes[56]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4196,7 +4284,7 @@ func (x *ExperimentFinishedEvent) String() string {
func (*ExperimentFinishedEvent) ProtoMessage() {}
func (x *ExperimentFinishedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[55]
+ mi := &file_proto_event_domain_event_proto_msgTypes[56]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4209,7 +4297,7 @@ func (x *ExperimentFinishedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExperimentFinishedEvent.ProtoReflect.Descriptor instead.
func (*ExperimentFinishedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{55}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{56}
}
type AccountV2CreatedEvent struct {
@@ -4235,7 +4323,7 @@ type AccountV2CreatedEvent struct {
func (x *AccountV2CreatedEvent) Reset() {
*x = AccountV2CreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[56]
+ mi := &file_proto_event_domain_event_proto_msgTypes[57]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4248,7 +4336,7 @@ func (x *AccountV2CreatedEvent) String() string {
func (*AccountV2CreatedEvent) ProtoMessage() {}
func (x *AccountV2CreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[56]
+ mi := &file_proto_event_domain_event_proto_msgTypes[57]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4261,7 +4349,7 @@ func (x *AccountV2CreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2CreatedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2CreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{56}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{57}
}
func (x *AccountV2CreatedEvent) GetEmail() string {
@@ -4367,7 +4455,7 @@ type AccountV2UpdatedEvent struct {
func (x *AccountV2UpdatedEvent) Reset() {
*x = AccountV2UpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[57]
+ mi := &file_proto_event_domain_event_proto_msgTypes[58]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4380,7 +4468,7 @@ func (x *AccountV2UpdatedEvent) String() string {
func (*AccountV2UpdatedEvent) ProtoMessage() {}
func (x *AccountV2UpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[57]
+ mi := &file_proto_event_domain_event_proto_msgTypes[58]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4393,7 +4481,7 @@ func (x *AccountV2UpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2UpdatedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2UpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{57}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{58}
}
func (x *AccountV2UpdatedEvent) GetEmail() string {
@@ -4422,7 +4510,7 @@ type AccountV2NameChangedEvent struct {
func (x *AccountV2NameChangedEvent) Reset() {
*x = AccountV2NameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[58]
+ mi := &file_proto_event_domain_event_proto_msgTypes[59]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4435,7 +4523,7 @@ func (x *AccountV2NameChangedEvent) String() string {
func (*AccountV2NameChangedEvent) ProtoMessage() {}
func (x *AccountV2NameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[58]
+ mi := &file_proto_event_domain_event_proto_msgTypes[59]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4448,7 +4536,7 @@ func (x *AccountV2NameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2NameChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2NameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{58}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{59}
}
func (x *AccountV2NameChangedEvent) GetEmail() string {
@@ -4477,7 +4565,7 @@ type AccountV2AvatarImageURLChangedEvent struct {
func (x *AccountV2AvatarImageURLChangedEvent) Reset() {
*x = AccountV2AvatarImageURLChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[59]
+ mi := &file_proto_event_domain_event_proto_msgTypes[60]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4490,7 +4578,7 @@ func (x *AccountV2AvatarImageURLChangedEvent) String() string {
func (*AccountV2AvatarImageURLChangedEvent) ProtoMessage() {}
func (x *AccountV2AvatarImageURLChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[59]
+ mi := &file_proto_event_domain_event_proto_msgTypes[60]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4503,7 +4591,7 @@ func (x *AccountV2AvatarImageURLChangedEvent) ProtoReflect() protoreflect.Messag
// Deprecated: Use AccountV2AvatarImageURLChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2AvatarImageURLChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{59}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{60}
}
func (x *AccountV2AvatarImageURLChangedEvent) GetEmail() string {
@@ -4532,7 +4620,7 @@ type AccountV2TagsChangedEvent struct {
func (x *AccountV2TagsChangedEvent) Reset() {
*x = AccountV2TagsChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[60]
+ mi := &file_proto_event_domain_event_proto_msgTypes[61]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4545,7 +4633,7 @@ func (x *AccountV2TagsChangedEvent) String() string {
func (*AccountV2TagsChangedEvent) ProtoMessage() {}
func (x *AccountV2TagsChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[60]
+ mi := &file_proto_event_domain_event_proto_msgTypes[61]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4558,7 +4646,7 @@ func (x *AccountV2TagsChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2TagsChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2TagsChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{60}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{61}
}
func (x *AccountV2TagsChangedEvent) GetEmail() string {
@@ -4587,7 +4675,7 @@ type AccountV2OrganizationRoleChangedEvent struct {
func (x *AccountV2OrganizationRoleChangedEvent) Reset() {
*x = AccountV2OrganizationRoleChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[61]
+ mi := &file_proto_event_domain_event_proto_msgTypes[62]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4600,7 +4688,7 @@ func (x *AccountV2OrganizationRoleChangedEvent) String() string {
func (*AccountV2OrganizationRoleChangedEvent) ProtoMessage() {}
func (x *AccountV2OrganizationRoleChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[61]
+ mi := &file_proto_event_domain_event_proto_msgTypes[62]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4613,7 +4701,7 @@ func (x *AccountV2OrganizationRoleChangedEvent) ProtoReflect() protoreflect.Mess
// Deprecated: Use AccountV2OrganizationRoleChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2OrganizationRoleChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{61}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{62}
}
func (x *AccountV2OrganizationRoleChangedEvent) GetEmail() string {
@@ -4642,7 +4730,7 @@ type AccountV2EnvironmentRolesChangedEvent struct {
func (x *AccountV2EnvironmentRolesChangedEvent) Reset() {
*x = AccountV2EnvironmentRolesChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[62]
+ mi := &file_proto_event_domain_event_proto_msgTypes[63]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4655,7 +4743,7 @@ func (x *AccountV2EnvironmentRolesChangedEvent) String() string {
func (*AccountV2EnvironmentRolesChangedEvent) ProtoMessage() {}
func (x *AccountV2EnvironmentRolesChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[62]
+ mi := &file_proto_event_domain_event_proto_msgTypes[63]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4668,7 +4756,7 @@ func (x *AccountV2EnvironmentRolesChangedEvent) ProtoReflect() protoreflect.Mess
// Deprecated: Use AccountV2EnvironmentRolesChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2EnvironmentRolesChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{62}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{63}
}
func (x *AccountV2EnvironmentRolesChangedEvent) GetEmail() string {
@@ -4696,7 +4784,7 @@ type AccountV2EnabledEvent struct {
func (x *AccountV2EnabledEvent) Reset() {
*x = AccountV2EnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[63]
+ mi := &file_proto_event_domain_event_proto_msgTypes[64]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4709,7 +4797,7 @@ func (x *AccountV2EnabledEvent) String() string {
func (*AccountV2EnabledEvent) ProtoMessage() {}
func (x *AccountV2EnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[63]
+ mi := &file_proto_event_domain_event_proto_msgTypes[64]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4722,7 +4810,7 @@ func (x *AccountV2EnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2EnabledEvent.ProtoReflect.Descriptor instead.
func (*AccountV2EnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{63}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{64}
}
func (x *AccountV2EnabledEvent) GetEmail() string {
@@ -4743,7 +4831,7 @@ type AccountV2DisabledEvent struct {
func (x *AccountV2DisabledEvent) Reset() {
*x = AccountV2DisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[64]
+ mi := &file_proto_event_domain_event_proto_msgTypes[65]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4756,7 +4844,7 @@ func (x *AccountV2DisabledEvent) String() string {
func (*AccountV2DisabledEvent) ProtoMessage() {}
func (x *AccountV2DisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[64]
+ mi := &file_proto_event_domain_event_proto_msgTypes[65]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4769,7 +4857,7 @@ func (x *AccountV2DisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2DisabledEvent.ProtoReflect.Descriptor instead.
func (*AccountV2DisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{64}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{65}
}
func (x *AccountV2DisabledEvent) GetEmail() string {
@@ -4790,7 +4878,7 @@ type AccountV2DeletedEvent struct {
func (x *AccountV2DeletedEvent) Reset() {
*x = AccountV2DeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[65]
+ mi := &file_proto_event_domain_event_proto_msgTypes[66]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4803,7 +4891,7 @@ func (x *AccountV2DeletedEvent) String() string {
func (*AccountV2DeletedEvent) ProtoMessage() {}
func (x *AccountV2DeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[65]
+ mi := &file_proto_event_domain_event_proto_msgTypes[66]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4816,7 +4904,7 @@ func (x *AccountV2DeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2DeletedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2DeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{65}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{66}
}
func (x *AccountV2DeletedEvent) GetEmail() string {
@@ -4841,7 +4929,7 @@ type SearchFilterCreatedEvent struct {
func (x *SearchFilterCreatedEvent) Reset() {
*x = SearchFilterCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[66]
+ mi := &file_proto_event_domain_event_proto_msgTypes[67]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4854,7 +4942,7 @@ func (x *SearchFilterCreatedEvent) String() string {
func (*SearchFilterCreatedEvent) ProtoMessage() {}
func (x *SearchFilterCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[66]
+ mi := &file_proto_event_domain_event_proto_msgTypes[67]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4867,7 +4955,7 @@ func (x *SearchFilterCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SearchFilterCreatedEvent.ProtoReflect.Descriptor instead.
func (*SearchFilterCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{66}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{67}
}
func (x *SearchFilterCreatedEvent) GetName() string {
@@ -4917,7 +5005,7 @@ type SearchFilterNameChangedEvent struct {
func (x *SearchFilterNameChangedEvent) Reset() {
*x = SearchFilterNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[67]
+ mi := &file_proto_event_domain_event_proto_msgTypes[68]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4930,7 +5018,7 @@ func (x *SearchFilterNameChangedEvent) String() string {
func (*SearchFilterNameChangedEvent) ProtoMessage() {}
func (x *SearchFilterNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[67]
+ mi := &file_proto_event_domain_event_proto_msgTypes[68]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4943,7 +5031,7 @@ func (x *SearchFilterNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SearchFilterNameChangedEvent.ProtoReflect.Descriptor instead.
func (*SearchFilterNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{67}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{68}
}
func (x *SearchFilterNameChangedEvent) GetId() string {
@@ -4972,7 +5060,7 @@ type SearchFilterQueryChangedEvent struct {
func (x *SearchFilterQueryChangedEvent) Reset() {
*x = SearchFilterQueryChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[68]
+ mi := &file_proto_event_domain_event_proto_msgTypes[69]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -4985,7 +5073,7 @@ func (x *SearchFilterQueryChangedEvent) String() string {
func (*SearchFilterQueryChangedEvent) ProtoMessage() {}
func (x *SearchFilterQueryChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[68]
+ mi := &file_proto_event_domain_event_proto_msgTypes[69]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -4998,7 +5086,7 @@ func (x *SearchFilterQueryChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SearchFilterQueryChangedEvent.ProtoReflect.Descriptor instead.
func (*SearchFilterQueryChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{68}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{69}
}
func (x *SearchFilterQueryChangedEvent) GetId() string {
@@ -5027,7 +5115,7 @@ type SearchFilterDefaultChangedEvent struct {
func (x *SearchFilterDefaultChangedEvent) Reset() {
*x = SearchFilterDefaultChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[69]
+ mi := &file_proto_event_domain_event_proto_msgTypes[70]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5040,7 +5128,7 @@ func (x *SearchFilterDefaultChangedEvent) String() string {
func (*SearchFilterDefaultChangedEvent) ProtoMessage() {}
func (x *SearchFilterDefaultChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[69]
+ mi := &file_proto_event_domain_event_proto_msgTypes[70]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5053,7 +5141,7 @@ func (x *SearchFilterDefaultChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SearchFilterDefaultChangedEvent.ProtoReflect.Descriptor instead.
func (*SearchFilterDefaultChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{69}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{70}
}
func (x *SearchFilterDefaultChangedEvent) GetId() string {
@@ -5081,7 +5169,7 @@ type SearchFilterDeletedEvent struct {
func (x *SearchFilterDeletedEvent) Reset() {
*x = SearchFilterDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[70]
+ mi := &file_proto_event_domain_event_proto_msgTypes[71]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5094,7 +5182,7 @@ func (x *SearchFilterDeletedEvent) String() string {
func (*SearchFilterDeletedEvent) ProtoMessage() {}
func (x *SearchFilterDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[70]
+ mi := &file_proto_event_domain_event_proto_msgTypes[71]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5107,7 +5195,7 @@ func (x *SearchFilterDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SearchFilterDeletedEvent.ProtoReflect.Descriptor instead.
func (*SearchFilterDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{70}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{71}
}
func (x *SearchFilterDeletedEvent) GetId() string {
@@ -5135,7 +5223,7 @@ type APIKeyCreatedEvent struct {
func (x *APIKeyCreatedEvent) Reset() {
*x = APIKeyCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[71]
+ mi := &file_proto_event_domain_event_proto_msgTypes[72]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5148,7 +5236,7 @@ func (x *APIKeyCreatedEvent) String() string {
func (*APIKeyCreatedEvent) ProtoMessage() {}
func (x *APIKeyCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[71]
+ mi := &file_proto_event_domain_event_proto_msgTypes[72]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5161,7 +5249,7 @@ func (x *APIKeyCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use APIKeyCreatedEvent.ProtoReflect.Descriptor instead.
func (*APIKeyCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{71}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{72}
}
func (x *APIKeyCreatedEvent) GetId() string {
@@ -5231,7 +5319,7 @@ type APIKeyChangedEvent struct {
func (x *APIKeyChangedEvent) Reset() {
*x = APIKeyChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[72]
+ mi := &file_proto_event_domain_event_proto_msgTypes[73]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5244,7 +5332,7 @@ func (x *APIKeyChangedEvent) String() string {
func (*APIKeyChangedEvent) ProtoMessage() {}
func (x *APIKeyChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[72]
+ mi := &file_proto_event_domain_event_proto_msgTypes[73]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5257,7 +5345,7 @@ func (x *APIKeyChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use APIKeyChangedEvent.ProtoReflect.Descriptor instead.
func (*APIKeyChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{72}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{73}
}
func (x *APIKeyChangedEvent) GetId() string {
@@ -5279,7 +5367,7 @@ type APIKeyNameChangedEvent struct {
func (x *APIKeyNameChangedEvent) Reset() {
*x = APIKeyNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[73]
+ mi := &file_proto_event_domain_event_proto_msgTypes[74]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5292,7 +5380,7 @@ func (x *APIKeyNameChangedEvent) String() string {
func (*APIKeyNameChangedEvent) ProtoMessage() {}
func (x *APIKeyNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[73]
+ mi := &file_proto_event_domain_event_proto_msgTypes[74]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5305,7 +5393,7 @@ func (x *APIKeyNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use APIKeyNameChangedEvent.ProtoReflect.Descriptor instead.
func (*APIKeyNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{73}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{74}
}
func (x *APIKeyNameChangedEvent) GetId() string {
@@ -5333,7 +5421,7 @@ type APIKeyEnabledEvent struct {
func (x *APIKeyEnabledEvent) Reset() {
*x = APIKeyEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[74]
+ mi := &file_proto_event_domain_event_proto_msgTypes[75]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5346,7 +5434,7 @@ func (x *APIKeyEnabledEvent) String() string {
func (*APIKeyEnabledEvent) ProtoMessage() {}
func (x *APIKeyEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[74]
+ mi := &file_proto_event_domain_event_proto_msgTypes[75]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5359,7 +5447,7 @@ func (x *APIKeyEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use APIKeyEnabledEvent.ProtoReflect.Descriptor instead.
func (*APIKeyEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{74}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{75}
}
func (x *APIKeyEnabledEvent) GetId() string {
@@ -5380,7 +5468,7 @@ type APIKeyDisabledEvent struct {
func (x *APIKeyDisabledEvent) Reset() {
*x = APIKeyDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[75]
+ mi := &file_proto_event_domain_event_proto_msgTypes[76]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5393,7 +5481,7 @@ func (x *APIKeyDisabledEvent) String() string {
func (*APIKeyDisabledEvent) ProtoMessage() {}
func (x *APIKeyDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[75]
+ mi := &file_proto_event_domain_event_proto_msgTypes[76]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5406,7 +5494,7 @@ func (x *APIKeyDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use APIKeyDisabledEvent.ProtoReflect.Descriptor instead.
func (*APIKeyDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{75}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{76}
}
func (x *APIKeyDisabledEvent) GetId() string {
@@ -5429,7 +5517,7 @@ type SegmentCreatedEvent struct {
func (x *SegmentCreatedEvent) Reset() {
*x = SegmentCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[76]
+ mi := &file_proto_event_domain_event_proto_msgTypes[77]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5442,7 +5530,7 @@ func (x *SegmentCreatedEvent) String() string {
func (*SegmentCreatedEvent) ProtoMessage() {}
func (x *SegmentCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[76]
+ mi := &file_proto_event_domain_event_proto_msgTypes[77]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5455,7 +5543,7 @@ func (x *SegmentCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentCreatedEvent.ProtoReflect.Descriptor instead.
func (*SegmentCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{76}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{77}
}
func (x *SegmentCreatedEvent) GetId() string {
@@ -5490,7 +5578,7 @@ type SegmentDeletedEvent struct {
func (x *SegmentDeletedEvent) Reset() {
*x = SegmentDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[77]
+ mi := &file_proto_event_domain_event_proto_msgTypes[78]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5503,7 +5591,7 @@ func (x *SegmentDeletedEvent) String() string {
func (*SegmentDeletedEvent) ProtoMessage() {}
func (x *SegmentDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[77]
+ mi := &file_proto_event_domain_event_proto_msgTypes[78]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5516,7 +5604,7 @@ func (x *SegmentDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentDeletedEvent.ProtoReflect.Descriptor instead.
func (*SegmentDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{77}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{78}
}
func (x *SegmentDeletedEvent) GetId() string {
@@ -5539,7 +5627,7 @@ type SegmentUpdatedEvent struct {
func (x *SegmentUpdatedEvent) Reset() {
*x = SegmentUpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[78]
+ mi := &file_proto_event_domain_event_proto_msgTypes[79]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5552,7 +5640,7 @@ func (x *SegmentUpdatedEvent) String() string {
func (*SegmentUpdatedEvent) ProtoMessage() {}
func (x *SegmentUpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[78]
+ mi := &file_proto_event_domain_event_proto_msgTypes[79]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5565,7 +5653,7 @@ func (x *SegmentUpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentUpdatedEvent.ProtoReflect.Descriptor instead.
func (*SegmentUpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{78}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{79}
}
func (x *SegmentUpdatedEvent) GetId() string {
@@ -5601,7 +5689,7 @@ type SegmentNameChangedEvent struct {
func (x *SegmentNameChangedEvent) Reset() {
*x = SegmentNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[79]
+ mi := &file_proto_event_domain_event_proto_msgTypes[80]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5614,7 +5702,7 @@ func (x *SegmentNameChangedEvent) String() string {
func (*SegmentNameChangedEvent) ProtoMessage() {}
func (x *SegmentNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[79]
+ mi := &file_proto_event_domain_event_proto_msgTypes[80]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5627,7 +5715,7 @@ func (x *SegmentNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentNameChangedEvent.ProtoReflect.Descriptor instead.
func (*SegmentNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{79}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{80}
}
func (x *SegmentNameChangedEvent) GetId() string {
@@ -5656,7 +5744,7 @@ type SegmentDescriptionChangedEvent struct {
func (x *SegmentDescriptionChangedEvent) Reset() {
*x = SegmentDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[80]
+ mi := &file_proto_event_domain_event_proto_msgTypes[81]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5669,7 +5757,7 @@ func (x *SegmentDescriptionChangedEvent) String() string {
func (*SegmentDescriptionChangedEvent) ProtoMessage() {}
func (x *SegmentDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[80]
+ mi := &file_proto_event_domain_event_proto_msgTypes[81]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5682,7 +5770,7 @@ func (x *SegmentDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*SegmentDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{80}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{81}
}
func (x *SegmentDescriptionChangedEvent) GetId() string {
@@ -5711,7 +5799,7 @@ type SegmentRuleAddedEvent struct {
func (x *SegmentRuleAddedEvent) Reset() {
*x = SegmentRuleAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[81]
+ mi := &file_proto_event_domain_event_proto_msgTypes[82]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5724,7 +5812,7 @@ func (x *SegmentRuleAddedEvent) String() string {
func (*SegmentRuleAddedEvent) ProtoMessage() {}
func (x *SegmentRuleAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[81]
+ mi := &file_proto_event_domain_event_proto_msgTypes[82]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5737,7 +5825,7 @@ func (x *SegmentRuleAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentRuleAddedEvent.ProtoReflect.Descriptor instead.
func (*SegmentRuleAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{81}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{82}
}
func (x *SegmentRuleAddedEvent) GetId() string {
@@ -5766,7 +5854,7 @@ type SegmentRuleDeletedEvent struct {
func (x *SegmentRuleDeletedEvent) Reset() {
*x = SegmentRuleDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[82]
+ mi := &file_proto_event_domain_event_proto_msgTypes[83]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5779,7 +5867,7 @@ func (x *SegmentRuleDeletedEvent) String() string {
func (*SegmentRuleDeletedEvent) ProtoMessage() {}
func (x *SegmentRuleDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[82]
+ mi := &file_proto_event_domain_event_proto_msgTypes[83]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5792,7 +5880,7 @@ func (x *SegmentRuleDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentRuleDeletedEvent.ProtoReflect.Descriptor instead.
func (*SegmentRuleDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{82}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{83}
}
func (x *SegmentRuleDeletedEvent) GetId() string {
@@ -5822,7 +5910,7 @@ type SegmentRuleClauseAddedEvent struct {
func (x *SegmentRuleClauseAddedEvent) Reset() {
*x = SegmentRuleClauseAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[83]
+ mi := &file_proto_event_domain_event_proto_msgTypes[84]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5835,7 +5923,7 @@ func (x *SegmentRuleClauseAddedEvent) String() string {
func (*SegmentRuleClauseAddedEvent) ProtoMessage() {}
func (x *SegmentRuleClauseAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[83]
+ mi := &file_proto_event_domain_event_proto_msgTypes[84]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5848,7 +5936,7 @@ func (x *SegmentRuleClauseAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentRuleClauseAddedEvent.ProtoReflect.Descriptor instead.
func (*SegmentRuleClauseAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{83}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{84}
}
func (x *SegmentRuleClauseAddedEvent) GetSegmentId() string {
@@ -5885,7 +5973,7 @@ type SegmentRuleClauseDeletedEvent struct {
func (x *SegmentRuleClauseDeletedEvent) Reset() {
*x = SegmentRuleClauseDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[84]
+ mi := &file_proto_event_domain_event_proto_msgTypes[85]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5898,7 +5986,7 @@ func (x *SegmentRuleClauseDeletedEvent) String() string {
func (*SegmentRuleClauseDeletedEvent) ProtoMessage() {}
func (x *SegmentRuleClauseDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[84]
+ mi := &file_proto_event_domain_event_proto_msgTypes[85]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5911,7 +5999,7 @@ func (x *SegmentRuleClauseDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentRuleClauseDeletedEvent.ProtoReflect.Descriptor instead.
func (*SegmentRuleClauseDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{84}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{85}
}
func (x *SegmentRuleClauseDeletedEvent) GetSegmentId() string {
@@ -5949,7 +6037,7 @@ type SegmentClauseAttributeChangedEvent struct {
func (x *SegmentClauseAttributeChangedEvent) Reset() {
*x = SegmentClauseAttributeChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[85]
+ mi := &file_proto_event_domain_event_proto_msgTypes[86]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -5962,7 +6050,7 @@ func (x *SegmentClauseAttributeChangedEvent) String() string {
func (*SegmentClauseAttributeChangedEvent) ProtoMessage() {}
func (x *SegmentClauseAttributeChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[85]
+ mi := &file_proto_event_domain_event_proto_msgTypes[86]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -5975,7 +6063,7 @@ func (x *SegmentClauseAttributeChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use SegmentClauseAttributeChangedEvent.ProtoReflect.Descriptor instead.
func (*SegmentClauseAttributeChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{85}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{86}
}
func (x *SegmentClauseAttributeChangedEvent) GetSegmentId() string {
@@ -6020,7 +6108,7 @@ type SegmentClauseOperatorChangedEvent struct {
func (x *SegmentClauseOperatorChangedEvent) Reset() {
*x = SegmentClauseOperatorChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[86]
+ mi := &file_proto_event_domain_event_proto_msgTypes[87]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6033,7 +6121,7 @@ func (x *SegmentClauseOperatorChangedEvent) String() string {
func (*SegmentClauseOperatorChangedEvent) ProtoMessage() {}
func (x *SegmentClauseOperatorChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[86]
+ mi := &file_proto_event_domain_event_proto_msgTypes[87]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6046,7 +6134,7 @@ func (x *SegmentClauseOperatorChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use SegmentClauseOperatorChangedEvent.ProtoReflect.Descriptor instead.
func (*SegmentClauseOperatorChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{86}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{87}
}
func (x *SegmentClauseOperatorChangedEvent) GetSegmentId() string {
@@ -6091,7 +6179,7 @@ type SegmentClauseValueAddedEvent struct {
func (x *SegmentClauseValueAddedEvent) Reset() {
*x = SegmentClauseValueAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[87]
+ mi := &file_proto_event_domain_event_proto_msgTypes[88]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6104,7 +6192,7 @@ func (x *SegmentClauseValueAddedEvent) String() string {
func (*SegmentClauseValueAddedEvent) ProtoMessage() {}
func (x *SegmentClauseValueAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[87]
+ mi := &file_proto_event_domain_event_proto_msgTypes[88]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6117,7 +6205,7 @@ func (x *SegmentClauseValueAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentClauseValueAddedEvent.ProtoReflect.Descriptor instead.
func (*SegmentClauseValueAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{87}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{88}
}
func (x *SegmentClauseValueAddedEvent) GetSegmentId() string {
@@ -6162,7 +6250,7 @@ type SegmentClauseValueRemovedEvent struct {
func (x *SegmentClauseValueRemovedEvent) Reset() {
*x = SegmentClauseValueRemovedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[88]
+ mi := &file_proto_event_domain_event_proto_msgTypes[89]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6175,7 +6263,7 @@ func (x *SegmentClauseValueRemovedEvent) String() string {
func (*SegmentClauseValueRemovedEvent) ProtoMessage() {}
func (x *SegmentClauseValueRemovedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[88]
+ mi := &file_proto_event_domain_event_proto_msgTypes[89]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6188,7 +6276,7 @@ func (x *SegmentClauseValueRemovedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentClauseValueRemovedEvent.ProtoReflect.Descriptor instead.
func (*SegmentClauseValueRemovedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{88}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{89}
}
func (x *SegmentClauseValueRemovedEvent) GetSegmentId() string {
@@ -6232,7 +6320,7 @@ type SegmentUserAddedEvent struct {
func (x *SegmentUserAddedEvent) Reset() {
*x = SegmentUserAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[89]
+ mi := &file_proto_event_domain_event_proto_msgTypes[90]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6245,7 +6333,7 @@ func (x *SegmentUserAddedEvent) String() string {
func (*SegmentUserAddedEvent) ProtoMessage() {}
func (x *SegmentUserAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[89]
+ mi := &file_proto_event_domain_event_proto_msgTypes[90]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6258,7 +6346,7 @@ func (x *SegmentUserAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentUserAddedEvent.ProtoReflect.Descriptor instead.
func (*SegmentUserAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{89}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{90}
}
func (x *SegmentUserAddedEvent) GetSegmentId() string {
@@ -6295,7 +6383,7 @@ type SegmentUserDeletedEvent struct {
func (x *SegmentUserDeletedEvent) Reset() {
*x = SegmentUserDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[90]
+ mi := &file_proto_event_domain_event_proto_msgTypes[91]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6308,7 +6396,7 @@ func (x *SegmentUserDeletedEvent) String() string {
func (*SegmentUserDeletedEvent) ProtoMessage() {}
func (x *SegmentUserDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[90]
+ mi := &file_proto_event_domain_event_proto_msgTypes[91]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6321,7 +6409,7 @@ func (x *SegmentUserDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentUserDeletedEvent.ProtoReflect.Descriptor instead.
func (*SegmentUserDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{90}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{91}
}
func (x *SegmentUserDeletedEvent) GetSegmentId() string {
@@ -6358,7 +6446,7 @@ type SegmentBulkUploadUsersEvent struct {
func (x *SegmentBulkUploadUsersEvent) Reset() {
*x = SegmentBulkUploadUsersEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[91]
+ mi := &file_proto_event_domain_event_proto_msgTypes[92]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6371,7 +6459,7 @@ func (x *SegmentBulkUploadUsersEvent) String() string {
func (*SegmentBulkUploadUsersEvent) ProtoMessage() {}
func (x *SegmentBulkUploadUsersEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[91]
+ mi := &file_proto_event_domain_event_proto_msgTypes[92]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6384,7 +6472,7 @@ func (x *SegmentBulkUploadUsersEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SegmentBulkUploadUsersEvent.ProtoReflect.Descriptor instead.
func (*SegmentBulkUploadUsersEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{91}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{92}
}
func (x *SegmentBulkUploadUsersEvent) GetSegmentId() string {
@@ -6422,7 +6510,7 @@ type SegmentBulkUploadUsersStatusChangedEvent struct {
func (x *SegmentBulkUploadUsersStatusChangedEvent) Reset() {
*x = SegmentBulkUploadUsersStatusChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[92]
+ mi := &file_proto_event_domain_event_proto_msgTypes[93]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6435,7 +6523,7 @@ func (x *SegmentBulkUploadUsersStatusChangedEvent) String() string {
func (*SegmentBulkUploadUsersStatusChangedEvent) ProtoMessage() {}
func (x *SegmentBulkUploadUsersStatusChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[92]
+ mi := &file_proto_event_domain_event_proto_msgTypes[93]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6448,7 +6536,7 @@ func (x *SegmentBulkUploadUsersStatusChangedEvent) ProtoReflect() protoreflect.M
// Deprecated: Use SegmentBulkUploadUsersStatusChangedEvent.ProtoReflect.Descriptor instead.
func (*SegmentBulkUploadUsersStatusChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{92}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{93}
}
func (x *SegmentBulkUploadUsersStatusChangedEvent) GetSegmentId() string {
@@ -6497,7 +6585,7 @@ type EnvironmentCreatedEvent struct {
func (x *EnvironmentCreatedEvent) Reset() {
*x = EnvironmentCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[93]
+ mi := &file_proto_event_domain_event_proto_msgTypes[94]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6510,7 +6598,7 @@ func (x *EnvironmentCreatedEvent) String() string {
func (*EnvironmentCreatedEvent) ProtoMessage() {}
func (x *EnvironmentCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[93]
+ mi := &file_proto_event_domain_event_proto_msgTypes[94]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6523,7 +6611,7 @@ func (x *EnvironmentCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentCreatedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{93}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{94}
}
func (x *EnvironmentCreatedEvent) GetId() string {
@@ -6594,7 +6682,7 @@ type EnvironmentRenamedEvent struct {
func (x *EnvironmentRenamedEvent) Reset() {
*x = EnvironmentRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[94]
+ mi := &file_proto_event_domain_event_proto_msgTypes[95]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6607,7 +6695,7 @@ func (x *EnvironmentRenamedEvent) String() string {
func (*EnvironmentRenamedEvent) ProtoMessage() {}
func (x *EnvironmentRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[94]
+ mi := &file_proto_event_domain_event_proto_msgTypes[95]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6620,7 +6708,7 @@ func (x *EnvironmentRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentRenamedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{94}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{95}
}
func (x *EnvironmentRenamedEvent) GetId() string {
@@ -6649,7 +6737,7 @@ type EnvironmentDescriptionChangedEvent struct {
func (x *EnvironmentDescriptionChangedEvent) Reset() {
*x = EnvironmentDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[95]
+ mi := &file_proto_event_domain_event_proto_msgTypes[96]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6662,7 +6750,7 @@ func (x *EnvironmentDescriptionChangedEvent) String() string {
func (*EnvironmentDescriptionChangedEvent) ProtoMessage() {}
func (x *EnvironmentDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[95]
+ mi := &file_proto_event_domain_event_proto_msgTypes[96]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6675,7 +6763,7 @@ func (x *EnvironmentDescriptionChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use EnvironmentDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{95}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{96}
}
func (x *EnvironmentDescriptionChangedEvent) GetId() string {
@@ -6704,7 +6792,7 @@ type EnvironmentDeletedEvent struct {
func (x *EnvironmentDeletedEvent) Reset() {
*x = EnvironmentDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[96]
+ mi := &file_proto_event_domain_event_proto_msgTypes[97]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6717,7 +6805,7 @@ func (x *EnvironmentDeletedEvent) String() string {
func (*EnvironmentDeletedEvent) ProtoMessage() {}
func (x *EnvironmentDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[96]
+ mi := &file_proto_event_domain_event_proto_msgTypes[97]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6730,7 +6818,7 @@ func (x *EnvironmentDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentDeletedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{96}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{97}
}
func (x *EnvironmentDeletedEvent) GetId() string {
@@ -6766,7 +6854,7 @@ type EnvironmentV2CreatedEvent struct {
func (x *EnvironmentV2CreatedEvent) Reset() {
*x = EnvironmentV2CreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[97]
+ mi := &file_proto_event_domain_event_proto_msgTypes[98]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6779,7 +6867,7 @@ func (x *EnvironmentV2CreatedEvent) String() string {
func (*EnvironmentV2CreatedEvent) ProtoMessage() {}
func (x *EnvironmentV2CreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[97]
+ mi := &file_proto_event_domain_event_proto_msgTypes[98]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6792,7 +6880,7 @@ func (x *EnvironmentV2CreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentV2CreatedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2CreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{97}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{98}
}
func (x *EnvironmentV2CreatedEvent) GetId() string {
@@ -6872,7 +6960,7 @@ type EnvironmentV2RenamedEvent struct {
func (x *EnvironmentV2RenamedEvent) Reset() {
*x = EnvironmentV2RenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[98]
+ mi := &file_proto_event_domain_event_proto_msgTypes[99]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6885,7 +6973,7 @@ func (x *EnvironmentV2RenamedEvent) String() string {
func (*EnvironmentV2RenamedEvent) ProtoMessage() {}
func (x *EnvironmentV2RenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[98]
+ mi := &file_proto_event_domain_event_proto_msgTypes[99]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6898,7 +6986,7 @@ func (x *EnvironmentV2RenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentV2RenamedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2RenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{98}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{99}
}
func (x *EnvironmentV2RenamedEvent) GetId() string {
@@ -6944,7 +7032,7 @@ type EnvironmentV2DescriptionChangedEvent struct {
func (x *EnvironmentV2DescriptionChangedEvent) Reset() {
*x = EnvironmentV2DescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[99]
+ mi := &file_proto_event_domain_event_proto_msgTypes[100]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -6957,7 +7045,7 @@ func (x *EnvironmentV2DescriptionChangedEvent) String() string {
func (*EnvironmentV2DescriptionChangedEvent) ProtoMessage() {}
func (x *EnvironmentV2DescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[99]
+ mi := &file_proto_event_domain_event_proto_msgTypes[100]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6970,7 +7058,7 @@ func (x *EnvironmentV2DescriptionChangedEvent) ProtoReflect() protoreflect.Messa
// Deprecated: Use EnvironmentV2DescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2DescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{99}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{100}
}
func (x *EnvironmentV2DescriptionChangedEvent) GetId() string {
@@ -7022,7 +7110,7 @@ type EnvironmentV2RequireCommentChangedEvent struct {
func (x *EnvironmentV2RequireCommentChangedEvent) Reset() {
*x = EnvironmentV2RequireCommentChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[100]
+ mi := &file_proto_event_domain_event_proto_msgTypes[101]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7035,7 +7123,7 @@ func (x *EnvironmentV2RequireCommentChangedEvent) String() string {
func (*EnvironmentV2RequireCommentChangedEvent) ProtoMessage() {}
func (x *EnvironmentV2RequireCommentChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[100]
+ mi := &file_proto_event_domain_event_proto_msgTypes[101]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7048,7 +7136,7 @@ func (x *EnvironmentV2RequireCommentChangedEvent) ProtoReflect() protoreflect.Me
// Deprecated: Use EnvironmentV2RequireCommentChangedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2RequireCommentChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{100}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{101}
}
func (x *EnvironmentV2RequireCommentChangedEvent) GetId() string {
@@ -7092,7 +7180,7 @@ type EnvironmentV2ArchivedEvent struct {
func (x *EnvironmentV2ArchivedEvent) Reset() {
*x = EnvironmentV2ArchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[101]
+ mi := &file_proto_event_domain_event_proto_msgTypes[102]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7105,7 +7193,7 @@ func (x *EnvironmentV2ArchivedEvent) String() string {
func (*EnvironmentV2ArchivedEvent) ProtoMessage() {}
func (x *EnvironmentV2ArchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[101]
+ mi := &file_proto_event_domain_event_proto_msgTypes[102]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7118,7 +7206,7 @@ func (x *EnvironmentV2ArchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentV2ArchivedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2ArchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{101}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{102}
}
func (x *EnvironmentV2ArchivedEvent) GetId() string {
@@ -7155,7 +7243,7 @@ type EnvironmentV2UnarchivedEvent struct {
func (x *EnvironmentV2UnarchivedEvent) Reset() {
*x = EnvironmentV2UnarchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[102]
+ mi := &file_proto_event_domain_event_proto_msgTypes[103]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7168,7 +7256,7 @@ func (x *EnvironmentV2UnarchivedEvent) String() string {
func (*EnvironmentV2UnarchivedEvent) ProtoMessage() {}
func (x *EnvironmentV2UnarchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[102]
+ mi := &file_proto_event_domain_event_proto_msgTypes[103]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7181,7 +7269,7 @@ func (x *EnvironmentV2UnarchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnvironmentV2UnarchivedEvent.ProtoReflect.Descriptor instead.
func (*EnvironmentV2UnarchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{102}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{103}
}
func (x *EnvironmentV2UnarchivedEvent) GetId() string {
@@ -7221,7 +7309,7 @@ type AutoOpsRuleCreatedEvent struct {
func (x *AutoOpsRuleCreatedEvent) Reset() {
*x = AutoOpsRuleCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[103]
+ mi := &file_proto_event_domain_event_proto_msgTypes[104]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7234,7 +7322,7 @@ func (x *AutoOpsRuleCreatedEvent) String() string {
func (*AutoOpsRuleCreatedEvent) ProtoMessage() {}
func (x *AutoOpsRuleCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[103]
+ mi := &file_proto_event_domain_event_proto_msgTypes[104]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7247,7 +7335,7 @@ func (x *AutoOpsRuleCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleCreatedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{103}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{104}
}
func (x *AutoOpsRuleCreatedEvent) GetFeatureId() string {
@@ -7301,7 +7389,7 @@ type AutoOpsRuleStoppedEvent struct {
func (x *AutoOpsRuleStoppedEvent) Reset() {
*x = AutoOpsRuleStoppedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[104]
+ mi := &file_proto_event_domain_event_proto_msgTypes[105]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7314,7 +7402,7 @@ func (x *AutoOpsRuleStoppedEvent) String() string {
func (*AutoOpsRuleStoppedEvent) ProtoMessage() {}
func (x *AutoOpsRuleStoppedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[104]
+ mi := &file_proto_event_domain_event_proto_msgTypes[105]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7327,7 +7415,7 @@ func (x *AutoOpsRuleStoppedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleStoppedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleStoppedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{104}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{105}
}
type AutoOpsRuleDeletedEvent struct {
@@ -7339,7 +7427,7 @@ type AutoOpsRuleDeletedEvent struct {
func (x *AutoOpsRuleDeletedEvent) Reset() {
*x = AutoOpsRuleDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[105]
+ mi := &file_proto_event_domain_event_proto_msgTypes[106]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7352,7 +7440,7 @@ func (x *AutoOpsRuleDeletedEvent) String() string {
func (*AutoOpsRuleDeletedEvent) ProtoMessage() {}
func (x *AutoOpsRuleDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[105]
+ mi := &file_proto_event_domain_event_proto_msgTypes[106]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7365,7 +7453,7 @@ func (x *AutoOpsRuleDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleDeletedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{105}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{106}
}
type AutoOpsRuleOpsTypeChangedEvent struct {
@@ -7379,7 +7467,7 @@ type AutoOpsRuleOpsTypeChangedEvent struct {
func (x *AutoOpsRuleOpsTypeChangedEvent) Reset() {
*x = AutoOpsRuleOpsTypeChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[106]
+ mi := &file_proto_event_domain_event_proto_msgTypes[107]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7392,7 +7480,7 @@ func (x *AutoOpsRuleOpsTypeChangedEvent) String() string {
func (*AutoOpsRuleOpsTypeChangedEvent) ProtoMessage() {}
func (x *AutoOpsRuleOpsTypeChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[106]
+ mi := &file_proto_event_domain_event_proto_msgTypes[107]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7405,7 +7493,7 @@ func (x *AutoOpsRuleOpsTypeChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleOpsTypeChangedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleOpsTypeChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{106}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{107}
}
func (x *AutoOpsRuleOpsTypeChangedEvent) GetOpsType() autoops.OpsType {
@@ -7426,7 +7514,7 @@ type AutoOpsRuleTriggeredAtChangedEvent struct {
func (x *AutoOpsRuleTriggeredAtChangedEvent) Reset() {
*x = AutoOpsRuleTriggeredAtChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[107]
+ mi := &file_proto_event_domain_event_proto_msgTypes[108]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7439,7 +7527,7 @@ func (x *AutoOpsRuleTriggeredAtChangedEvent) String() string {
func (*AutoOpsRuleTriggeredAtChangedEvent) ProtoMessage() {}
func (x *AutoOpsRuleTriggeredAtChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[107]
+ mi := &file_proto_event_domain_event_proto_msgTypes[108]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7452,7 +7540,7 @@ func (x *AutoOpsRuleTriggeredAtChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use AutoOpsRuleTriggeredAtChangedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleTriggeredAtChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{107}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{108}
}
type AutoOpsRuleOpsStatusChangedEvent struct {
@@ -7466,7 +7554,7 @@ type AutoOpsRuleOpsStatusChangedEvent struct {
func (x *AutoOpsRuleOpsStatusChangedEvent) Reset() {
*x = AutoOpsRuleOpsStatusChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[108]
+ mi := &file_proto_event_domain_event_proto_msgTypes[109]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7479,7 +7567,7 @@ func (x *AutoOpsRuleOpsStatusChangedEvent) String() string {
func (*AutoOpsRuleOpsStatusChangedEvent) ProtoMessage() {}
func (x *AutoOpsRuleOpsStatusChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[108]
+ mi := &file_proto_event_domain_event_proto_msgTypes[109]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7492,7 +7580,7 @@ func (x *AutoOpsRuleOpsStatusChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleOpsStatusChangedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleOpsStatusChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{108}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{109}
}
func (x *AutoOpsRuleOpsStatusChangedEvent) GetOpsStatus() autoops.AutoOpsStatus {
@@ -7514,7 +7602,7 @@ type OpsEventRateClauseAddedEvent struct {
func (x *OpsEventRateClauseAddedEvent) Reset() {
*x = OpsEventRateClauseAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[109]
+ mi := &file_proto_event_domain_event_proto_msgTypes[110]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7527,7 +7615,7 @@ func (x *OpsEventRateClauseAddedEvent) String() string {
func (*OpsEventRateClauseAddedEvent) ProtoMessage() {}
func (x *OpsEventRateClauseAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[109]
+ mi := &file_proto_event_domain_event_proto_msgTypes[110]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7540,7 +7628,7 @@ func (x *OpsEventRateClauseAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OpsEventRateClauseAddedEvent.ProtoReflect.Descriptor instead.
func (*OpsEventRateClauseAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{109}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{110}
}
func (x *OpsEventRateClauseAddedEvent) GetClauseId() string {
@@ -7569,7 +7657,7 @@ type OpsEventRateClauseChangedEvent struct {
func (x *OpsEventRateClauseChangedEvent) Reset() {
*x = OpsEventRateClauseChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[110]
+ mi := &file_proto_event_domain_event_proto_msgTypes[111]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7582,7 +7670,7 @@ func (x *OpsEventRateClauseChangedEvent) String() string {
func (*OpsEventRateClauseChangedEvent) ProtoMessage() {}
func (x *OpsEventRateClauseChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[110]
+ mi := &file_proto_event_domain_event_proto_msgTypes[111]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7595,7 +7683,7 @@ func (x *OpsEventRateClauseChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OpsEventRateClauseChangedEvent.ProtoReflect.Descriptor instead.
func (*OpsEventRateClauseChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{110}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{111}
}
func (x *OpsEventRateClauseChangedEvent) GetClauseId() string {
@@ -7623,7 +7711,7 @@ type AutoOpsRuleClauseDeletedEvent struct {
func (x *AutoOpsRuleClauseDeletedEvent) Reset() {
*x = AutoOpsRuleClauseDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[111]
+ mi := &file_proto_event_domain_event_proto_msgTypes[112]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7636,7 +7724,7 @@ func (x *AutoOpsRuleClauseDeletedEvent) String() string {
func (*AutoOpsRuleClauseDeletedEvent) ProtoMessage() {}
func (x *AutoOpsRuleClauseDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[111]
+ mi := &file_proto_event_domain_event_proto_msgTypes[112]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7649,7 +7737,7 @@ func (x *AutoOpsRuleClauseDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AutoOpsRuleClauseDeletedEvent.ProtoReflect.Descriptor instead.
func (*AutoOpsRuleClauseDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{111}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{112}
}
func (x *AutoOpsRuleClauseDeletedEvent) GetClauseId() string {
@@ -7671,7 +7759,7 @@ type DatetimeClauseAddedEvent struct {
func (x *DatetimeClauseAddedEvent) Reset() {
*x = DatetimeClauseAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[112]
+ mi := &file_proto_event_domain_event_proto_msgTypes[113]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7684,7 +7772,7 @@ func (x *DatetimeClauseAddedEvent) String() string {
func (*DatetimeClauseAddedEvent) ProtoMessage() {}
func (x *DatetimeClauseAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[112]
+ mi := &file_proto_event_domain_event_proto_msgTypes[113]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7697,7 +7785,7 @@ func (x *DatetimeClauseAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use DatetimeClauseAddedEvent.ProtoReflect.Descriptor instead.
func (*DatetimeClauseAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{112}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{113}
}
func (x *DatetimeClauseAddedEvent) GetClauseId() string {
@@ -7726,7 +7814,7 @@ type DatetimeClauseChangedEvent struct {
func (x *DatetimeClauseChangedEvent) Reset() {
*x = DatetimeClauseChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[113]
+ mi := &file_proto_event_domain_event_proto_msgTypes[114]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7739,7 +7827,7 @@ func (x *DatetimeClauseChangedEvent) String() string {
func (*DatetimeClauseChangedEvent) ProtoMessage() {}
func (x *DatetimeClauseChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[113]
+ mi := &file_proto_event_domain_event_proto_msgTypes[114]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7752,7 +7840,7 @@ func (x *DatetimeClauseChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use DatetimeClauseChangedEvent.ProtoReflect.Descriptor instead.
func (*DatetimeClauseChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{113}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{114}
}
func (x *DatetimeClauseChangedEvent) GetClauseId() string {
@@ -7782,7 +7870,7 @@ type PushCreatedEvent struct {
func (x *PushCreatedEvent) Reset() {
*x = PushCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[114]
+ mi := &file_proto_event_domain_event_proto_msgTypes[115]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7795,7 +7883,7 @@ func (x *PushCreatedEvent) String() string {
func (*PushCreatedEvent) ProtoMessage() {}
func (x *PushCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[114]
+ mi := &file_proto_event_domain_event_proto_msgTypes[115]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7808,7 +7896,7 @@ func (x *PushCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushCreatedEvent.ProtoReflect.Descriptor instead.
func (*PushCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{114}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{115}
}
func (x *PushCreatedEvent) GetFcmServiceAccount() string {
@@ -7841,7 +7929,7 @@ type PushDeletedEvent struct {
func (x *PushDeletedEvent) Reset() {
*x = PushDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[115]
+ mi := &file_proto_event_domain_event_proto_msgTypes[116]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7854,7 +7942,7 @@ func (x *PushDeletedEvent) String() string {
func (*PushDeletedEvent) ProtoMessage() {}
func (x *PushDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[115]
+ mi := &file_proto_event_domain_event_proto_msgTypes[116]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7867,7 +7955,7 @@ func (x *PushDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushDeletedEvent.ProtoReflect.Descriptor instead.
func (*PushDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{115}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{116}
}
type PushTagsAddedEvent struct {
@@ -7881,7 +7969,7 @@ type PushTagsAddedEvent struct {
func (x *PushTagsAddedEvent) Reset() {
*x = PushTagsAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[116]
+ mi := &file_proto_event_domain_event_proto_msgTypes[117]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7894,7 +7982,7 @@ func (x *PushTagsAddedEvent) String() string {
func (*PushTagsAddedEvent) ProtoMessage() {}
func (x *PushTagsAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[116]
+ mi := &file_proto_event_domain_event_proto_msgTypes[117]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7907,7 +7995,7 @@ func (x *PushTagsAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushTagsAddedEvent.ProtoReflect.Descriptor instead.
func (*PushTagsAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{116}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{117}
}
func (x *PushTagsAddedEvent) GetTags() []string {
@@ -7928,7 +8016,7 @@ type PushTagsDeletedEvent struct {
func (x *PushTagsDeletedEvent) Reset() {
*x = PushTagsDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[117]
+ mi := &file_proto_event_domain_event_proto_msgTypes[118]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7941,7 +8029,7 @@ func (x *PushTagsDeletedEvent) String() string {
func (*PushTagsDeletedEvent) ProtoMessage() {}
func (x *PushTagsDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[117]
+ mi := &file_proto_event_domain_event_proto_msgTypes[118]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -7954,7 +8042,7 @@ func (x *PushTagsDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushTagsDeletedEvent.ProtoReflect.Descriptor instead.
func (*PushTagsDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{117}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{118}
}
func (x *PushTagsDeletedEvent) GetTags() []string {
@@ -7975,7 +8063,7 @@ type PushRenamedEvent struct {
func (x *PushRenamedEvent) Reset() {
*x = PushRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[118]
+ mi := &file_proto_event_domain_event_proto_msgTypes[119]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7988,7 +8076,7 @@ func (x *PushRenamedEvent) String() string {
func (*PushRenamedEvent) ProtoMessage() {}
func (x *PushRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[118]
+ mi := &file_proto_event_domain_event_proto_msgTypes[119]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8001,7 +8089,7 @@ func (x *PushRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushRenamedEvent.ProtoReflect.Descriptor instead.
func (*PushRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{118}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{119}
}
func (x *PushRenamedEvent) GetName() string {
@@ -8022,7 +8110,7 @@ type PushTagsUpdatedEvent struct {
func (x *PushTagsUpdatedEvent) Reset() {
*x = PushTagsUpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[119]
+ mi := &file_proto_event_domain_event_proto_msgTypes[120]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8035,7 +8123,7 @@ func (x *PushTagsUpdatedEvent) String() string {
func (*PushTagsUpdatedEvent) ProtoMessage() {}
func (x *PushTagsUpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[119]
+ mi := &file_proto_event_domain_event_proto_msgTypes[120]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8048,7 +8136,7 @@ func (x *PushTagsUpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushTagsUpdatedEvent.ProtoReflect.Descriptor instead.
func (*PushTagsUpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{119}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{120}
}
func (x *PushTagsUpdatedEvent) GetTags() []string {
@@ -8070,7 +8158,7 @@ type PushUpdatedEvent struct {
func (x *PushUpdatedEvent) Reset() {
*x = PushUpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[120]
+ mi := &file_proto_event_domain_event_proto_msgTypes[121]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8083,7 +8171,7 @@ func (x *PushUpdatedEvent) String() string {
func (*PushUpdatedEvent) ProtoMessage() {}
func (x *PushUpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[120]
+ mi := &file_proto_event_domain_event_proto_msgTypes[121]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8096,7 +8184,7 @@ func (x *PushUpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushUpdatedEvent.ProtoReflect.Descriptor instead.
func (*PushUpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{120}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{121}
}
func (x *PushUpdatedEvent) GetName() *wrapperspb.StringValue {
@@ -8126,7 +8214,7 @@ type SubscriptionCreatedEvent struct {
func (x *SubscriptionCreatedEvent) Reset() {
*x = SubscriptionCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[121]
+ mi := &file_proto_event_domain_event_proto_msgTypes[122]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8139,7 +8227,7 @@ func (x *SubscriptionCreatedEvent) String() string {
func (*SubscriptionCreatedEvent) ProtoMessage() {}
func (x *SubscriptionCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[121]
+ mi := &file_proto_event_domain_event_proto_msgTypes[122]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8152,7 +8240,7 @@ func (x *SubscriptionCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionCreatedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{121}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{122}
}
func (x *SubscriptionCreatedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8185,7 +8273,7 @@ type SubscriptionDeletedEvent struct {
func (x *SubscriptionDeletedEvent) Reset() {
*x = SubscriptionDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[122]
+ mi := &file_proto_event_domain_event_proto_msgTypes[123]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8198,7 +8286,7 @@ func (x *SubscriptionDeletedEvent) String() string {
func (*SubscriptionDeletedEvent) ProtoMessage() {}
func (x *SubscriptionDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[122]
+ mi := &file_proto_event_domain_event_proto_msgTypes[123]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8211,7 +8299,7 @@ func (x *SubscriptionDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionDeletedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{122}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{123}
}
type SubscriptionEnabledEvent struct {
@@ -8223,7 +8311,7 @@ type SubscriptionEnabledEvent struct {
func (x *SubscriptionEnabledEvent) Reset() {
*x = SubscriptionEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[123]
+ mi := &file_proto_event_domain_event_proto_msgTypes[124]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8236,7 +8324,7 @@ func (x *SubscriptionEnabledEvent) String() string {
func (*SubscriptionEnabledEvent) ProtoMessage() {}
func (x *SubscriptionEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[123]
+ mi := &file_proto_event_domain_event_proto_msgTypes[124]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8249,7 +8337,7 @@ func (x *SubscriptionEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionEnabledEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{123}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{124}
}
type SubscriptionDisabledEvent struct {
@@ -8261,7 +8349,7 @@ type SubscriptionDisabledEvent struct {
func (x *SubscriptionDisabledEvent) Reset() {
*x = SubscriptionDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[124]
+ mi := &file_proto_event_domain_event_proto_msgTypes[125]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8274,7 +8362,7 @@ func (x *SubscriptionDisabledEvent) String() string {
func (*SubscriptionDisabledEvent) ProtoMessage() {}
func (x *SubscriptionDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[124]
+ mi := &file_proto_event_domain_event_proto_msgTypes[125]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8287,7 +8375,7 @@ func (x *SubscriptionDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionDisabledEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{124}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{125}
}
type SubscriptionSourceTypesAddedEvent struct {
@@ -8301,7 +8389,7 @@ type SubscriptionSourceTypesAddedEvent struct {
func (x *SubscriptionSourceTypesAddedEvent) Reset() {
*x = SubscriptionSourceTypesAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[125]
+ mi := &file_proto_event_domain_event_proto_msgTypes[126]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8314,7 +8402,7 @@ func (x *SubscriptionSourceTypesAddedEvent) String() string {
func (*SubscriptionSourceTypesAddedEvent) ProtoMessage() {}
func (x *SubscriptionSourceTypesAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[125]
+ mi := &file_proto_event_domain_event_proto_msgTypes[126]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8327,7 +8415,7 @@ func (x *SubscriptionSourceTypesAddedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use SubscriptionSourceTypesAddedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionSourceTypesAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{125}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{126}
}
func (x *SubscriptionSourceTypesAddedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8348,7 +8436,7 @@ type SubscriptionSourceTypesDeletedEvent struct {
func (x *SubscriptionSourceTypesDeletedEvent) Reset() {
*x = SubscriptionSourceTypesDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[126]
+ mi := &file_proto_event_domain_event_proto_msgTypes[127]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8361,7 +8449,7 @@ func (x *SubscriptionSourceTypesDeletedEvent) String() string {
func (*SubscriptionSourceTypesDeletedEvent) ProtoMessage() {}
func (x *SubscriptionSourceTypesDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[126]
+ mi := &file_proto_event_domain_event_proto_msgTypes[127]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8374,7 +8462,7 @@ func (x *SubscriptionSourceTypesDeletedEvent) ProtoReflect() protoreflect.Messag
// Deprecated: Use SubscriptionSourceTypesDeletedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionSourceTypesDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{126}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{127}
}
func (x *SubscriptionSourceTypesDeletedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8395,7 +8483,7 @@ type SubscriptionRenamedEvent struct {
func (x *SubscriptionRenamedEvent) Reset() {
*x = SubscriptionRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[127]
+ mi := &file_proto_event_domain_event_proto_msgTypes[128]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8408,7 +8496,7 @@ func (x *SubscriptionRenamedEvent) String() string {
func (*SubscriptionRenamedEvent) ProtoMessage() {}
func (x *SubscriptionRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[127]
+ mi := &file_proto_event_domain_event_proto_msgTypes[128]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8421,7 +8509,7 @@ func (x *SubscriptionRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionRenamedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{127}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{128}
}
func (x *SubscriptionRenamedEvent) GetName() string {
@@ -8445,7 +8533,7 @@ type SubscriptionUpdatedEvent struct {
func (x *SubscriptionUpdatedEvent) Reset() {
*x = SubscriptionUpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[128]
+ mi := &file_proto_event_domain_event_proto_msgTypes[129]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8458,7 +8546,7 @@ func (x *SubscriptionUpdatedEvent) String() string {
func (*SubscriptionUpdatedEvent) ProtoMessage() {}
func (x *SubscriptionUpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[128]
+ mi := &file_proto_event_domain_event_proto_msgTypes[129]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8471,7 +8559,7 @@ func (x *SubscriptionUpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use SubscriptionUpdatedEvent.ProtoReflect.Descriptor instead.
func (*SubscriptionUpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{128}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{129}
}
func (x *SubscriptionUpdatedEvent) GetId() string {
@@ -8515,7 +8603,7 @@ type AdminSubscriptionCreatedEvent struct {
func (x *AdminSubscriptionCreatedEvent) Reset() {
*x = AdminSubscriptionCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[129]
+ mi := &file_proto_event_domain_event_proto_msgTypes[130]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8528,7 +8616,7 @@ func (x *AdminSubscriptionCreatedEvent) String() string {
func (*AdminSubscriptionCreatedEvent) ProtoMessage() {}
func (x *AdminSubscriptionCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[129]
+ mi := &file_proto_event_domain_event_proto_msgTypes[130]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8541,7 +8629,7 @@ func (x *AdminSubscriptionCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AdminSubscriptionCreatedEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{129}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{130}
}
func (x *AdminSubscriptionCreatedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8574,7 +8662,7 @@ type AdminSubscriptionDeletedEvent struct {
func (x *AdminSubscriptionDeletedEvent) Reset() {
*x = AdminSubscriptionDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[130]
+ mi := &file_proto_event_domain_event_proto_msgTypes[131]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8587,7 +8675,7 @@ func (x *AdminSubscriptionDeletedEvent) String() string {
func (*AdminSubscriptionDeletedEvent) ProtoMessage() {}
func (x *AdminSubscriptionDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[130]
+ mi := &file_proto_event_domain_event_proto_msgTypes[131]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8600,7 +8688,7 @@ func (x *AdminSubscriptionDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AdminSubscriptionDeletedEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{130}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{131}
}
type AdminSubscriptionEnabledEvent struct {
@@ -8612,7 +8700,7 @@ type AdminSubscriptionEnabledEvent struct {
func (x *AdminSubscriptionEnabledEvent) Reset() {
*x = AdminSubscriptionEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[131]
+ mi := &file_proto_event_domain_event_proto_msgTypes[132]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8625,7 +8713,7 @@ func (x *AdminSubscriptionEnabledEvent) String() string {
func (*AdminSubscriptionEnabledEvent) ProtoMessage() {}
func (x *AdminSubscriptionEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[131]
+ mi := &file_proto_event_domain_event_proto_msgTypes[132]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8638,7 +8726,7 @@ func (x *AdminSubscriptionEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AdminSubscriptionEnabledEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{131}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{132}
}
type AdminSubscriptionDisabledEvent struct {
@@ -8650,7 +8738,7 @@ type AdminSubscriptionDisabledEvent struct {
func (x *AdminSubscriptionDisabledEvent) Reset() {
*x = AdminSubscriptionDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[132]
+ mi := &file_proto_event_domain_event_proto_msgTypes[133]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8663,7 +8751,7 @@ func (x *AdminSubscriptionDisabledEvent) String() string {
func (*AdminSubscriptionDisabledEvent) ProtoMessage() {}
func (x *AdminSubscriptionDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[132]
+ mi := &file_proto_event_domain_event_proto_msgTypes[133]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8676,7 +8764,7 @@ func (x *AdminSubscriptionDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AdminSubscriptionDisabledEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{132}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{133}
}
type AdminSubscriptionSourceTypesAddedEvent struct {
@@ -8690,7 +8778,7 @@ type AdminSubscriptionSourceTypesAddedEvent struct {
func (x *AdminSubscriptionSourceTypesAddedEvent) Reset() {
*x = AdminSubscriptionSourceTypesAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[133]
+ mi := &file_proto_event_domain_event_proto_msgTypes[134]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8703,7 +8791,7 @@ func (x *AdminSubscriptionSourceTypesAddedEvent) String() string {
func (*AdminSubscriptionSourceTypesAddedEvent) ProtoMessage() {}
func (x *AdminSubscriptionSourceTypesAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[133]
+ mi := &file_proto_event_domain_event_proto_msgTypes[134]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8716,7 +8804,7 @@ func (x *AdminSubscriptionSourceTypesAddedEvent) ProtoReflect() protoreflect.Mes
// Deprecated: Use AdminSubscriptionSourceTypesAddedEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionSourceTypesAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{133}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{134}
}
func (x *AdminSubscriptionSourceTypesAddedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8737,7 +8825,7 @@ type AdminSubscriptionSourceTypesDeletedEvent struct {
func (x *AdminSubscriptionSourceTypesDeletedEvent) Reset() {
*x = AdminSubscriptionSourceTypesDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[134]
+ mi := &file_proto_event_domain_event_proto_msgTypes[135]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8750,7 +8838,7 @@ func (x *AdminSubscriptionSourceTypesDeletedEvent) String() string {
func (*AdminSubscriptionSourceTypesDeletedEvent) ProtoMessage() {}
func (x *AdminSubscriptionSourceTypesDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[134]
+ mi := &file_proto_event_domain_event_proto_msgTypes[135]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8763,7 +8851,7 @@ func (x *AdminSubscriptionSourceTypesDeletedEvent) ProtoReflect() protoreflect.M
// Deprecated: Use AdminSubscriptionSourceTypesDeletedEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionSourceTypesDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{134}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{135}
}
func (x *AdminSubscriptionSourceTypesDeletedEvent) GetSourceTypes() []notification.Subscription_SourceType {
@@ -8784,7 +8872,7 @@ type AdminSubscriptionRenamedEvent struct {
func (x *AdminSubscriptionRenamedEvent) Reset() {
*x = AdminSubscriptionRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[135]
+ mi := &file_proto_event_domain_event_proto_msgTypes[136]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8797,7 +8885,7 @@ func (x *AdminSubscriptionRenamedEvent) String() string {
func (*AdminSubscriptionRenamedEvent) ProtoMessage() {}
func (x *AdminSubscriptionRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[135]
+ mi := &file_proto_event_domain_event_proto_msgTypes[136]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8810,7 +8898,7 @@ func (x *AdminSubscriptionRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AdminSubscriptionRenamedEvent.ProtoReflect.Descriptor instead.
func (*AdminSubscriptionRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{135}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{136}
}
func (x *AdminSubscriptionRenamedEvent) GetName() string {
@@ -8839,7 +8927,7 @@ type ProjectCreatedEvent struct {
func (x *ProjectCreatedEvent) Reset() {
*x = ProjectCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[136]
+ mi := &file_proto_event_domain_event_proto_msgTypes[137]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8852,7 +8940,7 @@ func (x *ProjectCreatedEvent) String() string {
func (*ProjectCreatedEvent) ProtoMessage() {}
func (x *ProjectCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[136]
+ mi := &file_proto_event_domain_event_proto_msgTypes[137]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8865,7 +8953,7 @@ func (x *ProjectCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectCreatedEvent.ProtoReflect.Descriptor instead.
func (*ProjectCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{136}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{137}
}
func (x *ProjectCreatedEvent) GetId() string {
@@ -8943,7 +9031,7 @@ type ProjectDescriptionChangedEvent struct {
func (x *ProjectDescriptionChangedEvent) Reset() {
*x = ProjectDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[137]
+ mi := &file_proto_event_domain_event_proto_msgTypes[138]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -8956,7 +9044,7 @@ func (x *ProjectDescriptionChangedEvent) String() string {
func (*ProjectDescriptionChangedEvent) ProtoMessage() {}
func (x *ProjectDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[137]
+ mi := &file_proto_event_domain_event_proto_msgTypes[138]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -8969,7 +9057,7 @@ func (x *ProjectDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*ProjectDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{137}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{138}
}
func (x *ProjectDescriptionChangedEvent) GetId() string {
@@ -8998,7 +9086,7 @@ type ProjectRenamedEvent struct {
func (x *ProjectRenamedEvent) Reset() {
*x = ProjectRenamedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[138]
+ mi := &file_proto_event_domain_event_proto_msgTypes[139]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9011,7 +9099,7 @@ func (x *ProjectRenamedEvent) String() string {
func (*ProjectRenamedEvent) ProtoMessage() {}
func (x *ProjectRenamedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[138]
+ mi := &file_proto_event_domain_event_proto_msgTypes[139]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9024,7 +9112,7 @@ func (x *ProjectRenamedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectRenamedEvent.ProtoReflect.Descriptor instead.
func (*ProjectRenamedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{138}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{139}
}
func (x *ProjectRenamedEvent) GetId() string {
@@ -9052,7 +9140,7 @@ type ProjectEnabledEvent struct {
func (x *ProjectEnabledEvent) Reset() {
*x = ProjectEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[139]
+ mi := &file_proto_event_domain_event_proto_msgTypes[140]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9065,7 +9153,7 @@ func (x *ProjectEnabledEvent) String() string {
func (*ProjectEnabledEvent) ProtoMessage() {}
func (x *ProjectEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[139]
+ mi := &file_proto_event_domain_event_proto_msgTypes[140]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9078,7 +9166,7 @@ func (x *ProjectEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectEnabledEvent.ProtoReflect.Descriptor instead.
func (*ProjectEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{139}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{140}
}
func (x *ProjectEnabledEvent) GetId() string {
@@ -9099,7 +9187,7 @@ type ProjectDisabledEvent struct {
func (x *ProjectDisabledEvent) Reset() {
*x = ProjectDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[140]
+ mi := &file_proto_event_domain_event_proto_msgTypes[141]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9112,7 +9200,7 @@ func (x *ProjectDisabledEvent) String() string {
func (*ProjectDisabledEvent) ProtoMessage() {}
func (x *ProjectDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[140]
+ mi := &file_proto_event_domain_event_proto_msgTypes[141]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9125,7 +9213,7 @@ func (x *ProjectDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectDisabledEvent.ProtoReflect.Descriptor instead.
func (*ProjectDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{140}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{141}
}
func (x *ProjectDisabledEvent) GetId() string {
@@ -9154,7 +9242,7 @@ type ProjectTrialCreatedEvent struct {
func (x *ProjectTrialCreatedEvent) Reset() {
*x = ProjectTrialCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[141]
+ mi := &file_proto_event_domain_event_proto_msgTypes[142]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9167,7 +9255,7 @@ func (x *ProjectTrialCreatedEvent) String() string {
func (*ProjectTrialCreatedEvent) ProtoMessage() {}
func (x *ProjectTrialCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[141]
+ mi := &file_proto_event_domain_event_proto_msgTypes[142]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9180,7 +9268,7 @@ func (x *ProjectTrialCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectTrialCreatedEvent.ProtoReflect.Descriptor instead.
func (*ProjectTrialCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{141}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{142}
}
func (x *ProjectTrialCreatedEvent) GetId() string {
@@ -9257,7 +9345,7 @@ type ProjectTrialConvertedEvent struct {
func (x *ProjectTrialConvertedEvent) Reset() {
*x = ProjectTrialConvertedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[142]
+ mi := &file_proto_event_domain_event_proto_msgTypes[143]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9270,7 +9358,7 @@ func (x *ProjectTrialConvertedEvent) String() string {
func (*ProjectTrialConvertedEvent) ProtoMessage() {}
func (x *ProjectTrialConvertedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[142]
+ mi := &file_proto_event_domain_event_proto_msgTypes[143]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9283,7 +9371,7 @@ func (x *ProjectTrialConvertedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProjectTrialConvertedEvent.ProtoReflect.Descriptor instead.
func (*ProjectTrialConvertedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{142}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{143}
}
func (x *ProjectTrialConvertedEvent) GetId() string {
@@ -9304,7 +9392,7 @@ type PrerequisiteAddedEvent struct {
func (x *PrerequisiteAddedEvent) Reset() {
*x = PrerequisiteAddedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[143]
+ mi := &file_proto_event_domain_event_proto_msgTypes[144]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9317,7 +9405,7 @@ func (x *PrerequisiteAddedEvent) String() string {
func (*PrerequisiteAddedEvent) ProtoMessage() {}
func (x *PrerequisiteAddedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[143]
+ mi := &file_proto_event_domain_event_proto_msgTypes[144]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9330,7 +9418,7 @@ func (x *PrerequisiteAddedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PrerequisiteAddedEvent.ProtoReflect.Descriptor instead.
func (*PrerequisiteAddedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{143}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{144}
}
func (x *PrerequisiteAddedEvent) GetPrerequisite() *feature.Prerequisite {
@@ -9351,7 +9439,7 @@ type PrerequisiteVariationChangedEvent struct {
func (x *PrerequisiteVariationChangedEvent) Reset() {
*x = PrerequisiteVariationChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[144]
+ mi := &file_proto_event_domain_event_proto_msgTypes[145]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9364,7 +9452,7 @@ func (x *PrerequisiteVariationChangedEvent) String() string {
func (*PrerequisiteVariationChangedEvent) ProtoMessage() {}
func (x *PrerequisiteVariationChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[144]
+ mi := &file_proto_event_domain_event_proto_msgTypes[145]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9377,7 +9465,7 @@ func (x *PrerequisiteVariationChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use PrerequisiteVariationChangedEvent.ProtoReflect.Descriptor instead.
func (*PrerequisiteVariationChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{144}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{145}
}
func (x *PrerequisiteVariationChangedEvent) GetPrerequisite() *feature.Prerequisite {
@@ -9398,7 +9486,7 @@ type PrerequisiteRemovedEvent struct {
func (x *PrerequisiteRemovedEvent) Reset() {
*x = PrerequisiteRemovedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[145]
+ mi := &file_proto_event_domain_event_proto_msgTypes[146]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9411,7 +9499,7 @@ func (x *PrerequisiteRemovedEvent) String() string {
func (*PrerequisiteRemovedEvent) ProtoMessage() {}
func (x *PrerequisiteRemovedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[145]
+ mi := &file_proto_event_domain_event_proto_msgTypes[146]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9424,7 +9512,7 @@ func (x *PrerequisiteRemovedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use PrerequisiteRemovedEvent.ProtoReflect.Descriptor instead.
func (*PrerequisiteRemovedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{145}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{146}
}
func (x *PrerequisiteRemovedEvent) GetFeatureId() string {
@@ -9450,7 +9538,7 @@ type ProgressiveRolloutCreatedEvent struct {
func (x *ProgressiveRolloutCreatedEvent) Reset() {
*x = ProgressiveRolloutCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[146]
+ mi := &file_proto_event_domain_event_proto_msgTypes[147]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9463,7 +9551,7 @@ func (x *ProgressiveRolloutCreatedEvent) String() string {
func (*ProgressiveRolloutCreatedEvent) ProtoMessage() {}
func (x *ProgressiveRolloutCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[146]
+ mi := &file_proto_event_domain_event_proto_msgTypes[147]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9476,7 +9564,7 @@ func (x *ProgressiveRolloutCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProgressiveRolloutCreatedEvent.ProtoReflect.Descriptor instead.
func (*ProgressiveRolloutCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{146}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{147}
}
func (x *ProgressiveRolloutCreatedEvent) GetId() string {
@@ -9535,7 +9623,7 @@ type ProgressiveRolloutStoppedEvent struct {
func (x *ProgressiveRolloutStoppedEvent) Reset() {
*x = ProgressiveRolloutStoppedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[147]
+ mi := &file_proto_event_domain_event_proto_msgTypes[148]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9548,7 +9636,7 @@ func (x *ProgressiveRolloutStoppedEvent) String() string {
func (*ProgressiveRolloutStoppedEvent) ProtoMessage() {}
func (x *ProgressiveRolloutStoppedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[147]
+ mi := &file_proto_event_domain_event_proto_msgTypes[148]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9561,7 +9649,7 @@ func (x *ProgressiveRolloutStoppedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProgressiveRolloutStoppedEvent.ProtoReflect.Descriptor instead.
func (*ProgressiveRolloutStoppedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{147}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{148}
}
func (x *ProgressiveRolloutStoppedEvent) GetId() string {
@@ -9603,7 +9691,7 @@ type ProgressiveRolloutDeletedEvent struct {
func (x *ProgressiveRolloutDeletedEvent) Reset() {
*x = ProgressiveRolloutDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[148]
+ mi := &file_proto_event_domain_event_proto_msgTypes[149]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9616,7 +9704,7 @@ func (x *ProgressiveRolloutDeletedEvent) String() string {
func (*ProgressiveRolloutDeletedEvent) ProtoMessage() {}
func (x *ProgressiveRolloutDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[148]
+ mi := &file_proto_event_domain_event_proto_msgTypes[149]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9629,7 +9717,7 @@ func (x *ProgressiveRolloutDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use ProgressiveRolloutDeletedEvent.ProtoReflect.Descriptor instead.
func (*ProgressiveRolloutDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{148}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{149}
}
func (x *ProgressiveRolloutDeletedEvent) GetId() string {
@@ -9650,7 +9738,7 @@ type ProgressiveRolloutScheduleTriggeredAtChangedEvent struct {
func (x *ProgressiveRolloutScheduleTriggeredAtChangedEvent) Reset() {
*x = ProgressiveRolloutScheduleTriggeredAtChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[149]
+ mi := &file_proto_event_domain_event_proto_msgTypes[150]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9663,7 +9751,7 @@ func (x *ProgressiveRolloutScheduleTriggeredAtChangedEvent) String() string {
func (*ProgressiveRolloutScheduleTriggeredAtChangedEvent) ProtoMessage() {}
func (x *ProgressiveRolloutScheduleTriggeredAtChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[149]
+ mi := &file_proto_event_domain_event_proto_msgTypes[150]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9676,7 +9764,7 @@ func (x *ProgressiveRolloutScheduleTriggeredAtChangedEvent) ProtoReflect() proto
// Deprecated: Use ProgressiveRolloutScheduleTriggeredAtChangedEvent.ProtoReflect.Descriptor instead.
func (*ProgressiveRolloutScheduleTriggeredAtChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{149}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{150}
}
func (x *ProgressiveRolloutScheduleTriggeredAtChangedEvent) GetScheduleId() string {
@@ -9706,7 +9794,7 @@ type OrganizationCreatedEvent struct {
func (x *OrganizationCreatedEvent) Reset() {
*x = OrganizationCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[150]
+ mi := &file_proto_event_domain_event_proto_msgTypes[151]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9719,7 +9807,7 @@ func (x *OrganizationCreatedEvent) String() string {
func (*OrganizationCreatedEvent) ProtoMessage() {}
func (x *OrganizationCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[150]
+ mi := &file_proto_event_domain_event_proto_msgTypes[151]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9732,7 +9820,7 @@ func (x *OrganizationCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationCreatedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{150}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{151}
}
func (x *OrganizationCreatedEvent) GetId() string {
@@ -9817,7 +9905,7 @@ type OrganizationDescriptionChangedEvent struct {
func (x *OrganizationDescriptionChangedEvent) Reset() {
*x = OrganizationDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[151]
+ mi := &file_proto_event_domain_event_proto_msgTypes[152]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9830,7 +9918,7 @@ func (x *OrganizationDescriptionChangedEvent) String() string {
func (*OrganizationDescriptionChangedEvent) ProtoMessage() {}
func (x *OrganizationDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[151]
+ mi := &file_proto_event_domain_event_proto_msgTypes[152]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9843,7 +9931,7 @@ func (x *OrganizationDescriptionChangedEvent) ProtoReflect() protoreflect.Messag
// Deprecated: Use OrganizationDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{151}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{152}
}
func (x *OrganizationDescriptionChangedEvent) GetId() string {
@@ -9872,7 +9960,7 @@ type OrganizationOwnerEmailChangedEvent struct {
func (x *OrganizationOwnerEmailChangedEvent) Reset() {
*x = OrganizationOwnerEmailChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[152]
+ mi := &file_proto_event_domain_event_proto_msgTypes[153]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9885,7 +9973,7 @@ func (x *OrganizationOwnerEmailChangedEvent) String() string {
func (*OrganizationOwnerEmailChangedEvent) ProtoMessage() {}
func (x *OrganizationOwnerEmailChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[152]
+ mi := &file_proto_event_domain_event_proto_msgTypes[153]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9898,7 +9986,7 @@ func (x *OrganizationOwnerEmailChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use OrganizationOwnerEmailChangedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationOwnerEmailChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{152}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{153}
}
func (x *OrganizationOwnerEmailChangedEvent) GetId() string {
@@ -9927,7 +10015,7 @@ type OrganizationNameChangedEvent struct {
func (x *OrganizationNameChangedEvent) Reset() {
*x = OrganizationNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[153]
+ mi := &file_proto_event_domain_event_proto_msgTypes[154]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9940,7 +10028,7 @@ func (x *OrganizationNameChangedEvent) String() string {
func (*OrganizationNameChangedEvent) ProtoMessage() {}
func (x *OrganizationNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[153]
+ mi := &file_proto_event_domain_event_proto_msgTypes[154]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -9953,7 +10041,7 @@ func (x *OrganizationNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationNameChangedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{153}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{154}
}
func (x *OrganizationNameChangedEvent) GetId() string {
@@ -9981,7 +10069,7 @@ type OrganizationEnabledEvent struct {
func (x *OrganizationEnabledEvent) Reset() {
*x = OrganizationEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[154]
+ mi := &file_proto_event_domain_event_proto_msgTypes[155]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -9994,7 +10082,7 @@ func (x *OrganizationEnabledEvent) String() string {
func (*OrganizationEnabledEvent) ProtoMessage() {}
func (x *OrganizationEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[154]
+ mi := &file_proto_event_domain_event_proto_msgTypes[155]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10007,7 +10095,7 @@ func (x *OrganizationEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationEnabledEvent.ProtoReflect.Descriptor instead.
func (*OrganizationEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{154}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{155}
}
func (x *OrganizationEnabledEvent) GetId() string {
@@ -10028,7 +10116,7 @@ type OrganizationDisabledEvent struct {
func (x *OrganizationDisabledEvent) Reset() {
*x = OrganizationDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[155]
+ mi := &file_proto_event_domain_event_proto_msgTypes[156]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10041,7 +10129,7 @@ func (x *OrganizationDisabledEvent) String() string {
func (*OrganizationDisabledEvent) ProtoMessage() {}
func (x *OrganizationDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[155]
+ mi := &file_proto_event_domain_event_proto_msgTypes[156]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10054,7 +10142,7 @@ func (x *OrganizationDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationDisabledEvent.ProtoReflect.Descriptor instead.
func (*OrganizationDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{155}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{156}
}
func (x *OrganizationDisabledEvent) GetId() string {
@@ -10075,7 +10163,7 @@ type OrganizationArchivedEvent struct {
func (x *OrganizationArchivedEvent) Reset() {
*x = OrganizationArchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[156]
+ mi := &file_proto_event_domain_event_proto_msgTypes[157]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10088,7 +10176,7 @@ func (x *OrganizationArchivedEvent) String() string {
func (*OrganizationArchivedEvent) ProtoMessage() {}
func (x *OrganizationArchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[156]
+ mi := &file_proto_event_domain_event_proto_msgTypes[157]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10101,7 +10189,7 @@ func (x *OrganizationArchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationArchivedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationArchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{156}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{157}
}
func (x *OrganizationArchivedEvent) GetId() string {
@@ -10122,7 +10210,7 @@ type OrganizationUnarchivedEvent struct {
func (x *OrganizationUnarchivedEvent) Reset() {
*x = OrganizationUnarchivedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[157]
+ mi := &file_proto_event_domain_event_proto_msgTypes[158]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10135,7 +10223,7 @@ func (x *OrganizationUnarchivedEvent) String() string {
func (*OrganizationUnarchivedEvent) ProtoMessage() {}
func (x *OrganizationUnarchivedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[157]
+ mi := &file_proto_event_domain_event_proto_msgTypes[158]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10148,7 +10236,7 @@ func (x *OrganizationUnarchivedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationUnarchivedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationUnarchivedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{157}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{158}
}
func (x *OrganizationUnarchivedEvent) GetId() string {
@@ -10169,7 +10257,7 @@ type OrganizationTrialConvertedEvent struct {
func (x *OrganizationTrialConvertedEvent) Reset() {
*x = OrganizationTrialConvertedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[158]
+ mi := &file_proto_event_domain_event_proto_msgTypes[159]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10182,7 +10270,7 @@ func (x *OrganizationTrialConvertedEvent) String() string {
func (*OrganizationTrialConvertedEvent) ProtoMessage() {}
func (x *OrganizationTrialConvertedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[158]
+ mi := &file_proto_event_domain_event_proto_msgTypes[159]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10195,7 +10283,7 @@ func (x *OrganizationTrialConvertedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use OrganizationTrialConvertedEvent.ProtoReflect.Descriptor instead.
func (*OrganizationTrialConvertedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{158}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{159}
}
func (x *OrganizationTrialConvertedEvent) GetId() string {
@@ -10224,7 +10312,7 @@ type FlagTriggerCreatedEvent struct {
func (x *FlagTriggerCreatedEvent) Reset() {
*x = FlagTriggerCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[159]
+ mi := &file_proto_event_domain_event_proto_msgTypes[160]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10237,7 +10325,7 @@ func (x *FlagTriggerCreatedEvent) String() string {
func (*FlagTriggerCreatedEvent) ProtoMessage() {}
func (x *FlagTriggerCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[159]
+ mi := &file_proto_event_domain_event_proto_msgTypes[160]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10250,7 +10338,7 @@ func (x *FlagTriggerCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerCreatedEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{159}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{160}
}
func (x *FlagTriggerCreatedEvent) GetId() string {
@@ -10330,7 +10418,7 @@ type FlagTriggerResetEvent struct {
func (x *FlagTriggerResetEvent) Reset() {
*x = FlagTriggerResetEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[160]
+ mi := &file_proto_event_domain_event_proto_msgTypes[161]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10343,7 +10431,7 @@ func (x *FlagTriggerResetEvent) String() string {
func (*FlagTriggerResetEvent) ProtoMessage() {}
func (x *FlagTriggerResetEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[160]
+ mi := &file_proto_event_domain_event_proto_msgTypes[161]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10356,7 +10444,7 @@ func (x *FlagTriggerResetEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerResetEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerResetEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{160}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{161}
}
func (x *FlagTriggerResetEvent) GetId() string {
@@ -10401,7 +10489,7 @@ type FlagTriggerDescriptionChangedEvent struct {
func (x *FlagTriggerDescriptionChangedEvent) Reset() {
*x = FlagTriggerDescriptionChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[161]
+ mi := &file_proto_event_domain_event_proto_msgTypes[162]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10414,7 +10502,7 @@ func (x *FlagTriggerDescriptionChangedEvent) String() string {
func (*FlagTriggerDescriptionChangedEvent) ProtoMessage() {}
func (x *FlagTriggerDescriptionChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[161]
+ mi := &file_proto_event_domain_event_proto_msgTypes[162]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10427,7 +10515,7 @@ func (x *FlagTriggerDescriptionChangedEvent) ProtoReflect() protoreflect.Message
// Deprecated: Use FlagTriggerDescriptionChangedEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerDescriptionChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{161}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{162}
}
func (x *FlagTriggerDescriptionChangedEvent) GetId() string {
@@ -10471,7 +10559,7 @@ type FlagTriggerDisabledEvent struct {
func (x *FlagTriggerDisabledEvent) Reset() {
*x = FlagTriggerDisabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[162]
+ mi := &file_proto_event_domain_event_proto_msgTypes[163]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10484,7 +10572,7 @@ func (x *FlagTriggerDisabledEvent) String() string {
func (*FlagTriggerDisabledEvent) ProtoMessage() {}
func (x *FlagTriggerDisabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[162]
+ mi := &file_proto_event_domain_event_proto_msgTypes[163]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10497,7 +10585,7 @@ func (x *FlagTriggerDisabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerDisabledEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerDisabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{162}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{163}
}
func (x *FlagTriggerDisabledEvent) GetId() string {
@@ -10534,7 +10622,7 @@ type FlagTriggerEnabledEvent struct {
func (x *FlagTriggerEnabledEvent) Reset() {
*x = FlagTriggerEnabledEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[163]
+ mi := &file_proto_event_domain_event_proto_msgTypes[164]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10547,7 +10635,7 @@ func (x *FlagTriggerEnabledEvent) String() string {
func (*FlagTriggerEnabledEvent) ProtoMessage() {}
func (x *FlagTriggerEnabledEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[163]
+ mi := &file_proto_event_domain_event_proto_msgTypes[164]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10560,7 +10648,7 @@ func (x *FlagTriggerEnabledEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerEnabledEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerEnabledEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{163}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{164}
}
func (x *FlagTriggerEnabledEvent) GetId() string {
@@ -10597,7 +10685,7 @@ type FlagTriggerDeletedEvent struct {
func (x *FlagTriggerDeletedEvent) Reset() {
*x = FlagTriggerDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[164]
+ mi := &file_proto_event_domain_event_proto_msgTypes[165]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10610,7 +10698,7 @@ func (x *FlagTriggerDeletedEvent) String() string {
func (*FlagTriggerDeletedEvent) ProtoMessage() {}
func (x *FlagTriggerDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[164]
+ mi := &file_proto_event_domain_event_proto_msgTypes[165]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10623,7 +10711,7 @@ func (x *FlagTriggerDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerDeletedEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{164}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{165}
}
func (x *FlagTriggerDeletedEvent) GetId() string {
@@ -10662,7 +10750,7 @@ type FlagTriggerUsageUpdatedEvent struct {
func (x *FlagTriggerUsageUpdatedEvent) Reset() {
*x = FlagTriggerUsageUpdatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[165]
+ mi := &file_proto_event_domain_event_proto_msgTypes[166]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10675,7 +10763,7 @@ func (x *FlagTriggerUsageUpdatedEvent) String() string {
func (*FlagTriggerUsageUpdatedEvent) ProtoMessage() {}
func (x *FlagTriggerUsageUpdatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[165]
+ mi := &file_proto_event_domain_event_proto_msgTypes[166]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10688,7 +10776,7 @@ func (x *FlagTriggerUsageUpdatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use FlagTriggerUsageUpdatedEvent.ProtoReflect.Descriptor instead.
func (*FlagTriggerUsageUpdatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{165}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{166}
}
func (x *FlagTriggerUsageUpdatedEvent) GetId() string {
@@ -10738,7 +10826,7 @@ type AccountV2FirstNameChangedEvent struct {
func (x *AccountV2FirstNameChangedEvent) Reset() {
*x = AccountV2FirstNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[166]
+ mi := &file_proto_event_domain_event_proto_msgTypes[167]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10751,7 +10839,7 @@ func (x *AccountV2FirstNameChangedEvent) String() string {
func (*AccountV2FirstNameChangedEvent) ProtoMessage() {}
func (x *AccountV2FirstNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[166]
+ mi := &file_proto_event_domain_event_proto_msgTypes[167]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10764,7 +10852,7 @@ func (x *AccountV2FirstNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2FirstNameChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2FirstNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{166}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{167}
}
func (x *AccountV2FirstNameChangedEvent) GetEmail() string {
@@ -10793,7 +10881,7 @@ type AccountV2LastNameChangedEvent struct {
func (x *AccountV2LastNameChangedEvent) Reset() {
*x = AccountV2LastNameChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[167]
+ mi := &file_proto_event_domain_event_proto_msgTypes[168]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10806,7 +10894,7 @@ func (x *AccountV2LastNameChangedEvent) String() string {
func (*AccountV2LastNameChangedEvent) ProtoMessage() {}
func (x *AccountV2LastNameChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[167]
+ mi := &file_proto_event_domain_event_proto_msgTypes[168]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10819,7 +10907,7 @@ func (x *AccountV2LastNameChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2LastNameChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2LastNameChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{167}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{168}
}
func (x *AccountV2LastNameChangedEvent) GetEmail() string {
@@ -10848,7 +10936,7 @@ type AccountV2LanguageChangedEvent struct {
func (x *AccountV2LanguageChangedEvent) Reset() {
*x = AccountV2LanguageChangedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[168]
+ mi := &file_proto_event_domain_event_proto_msgTypes[169]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10861,7 +10949,7 @@ func (x *AccountV2LanguageChangedEvent) String() string {
func (*AccountV2LanguageChangedEvent) ProtoMessage() {}
func (x *AccountV2LanguageChangedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[168]
+ mi := &file_proto_event_domain_event_proto_msgTypes[169]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10874,7 +10962,7 @@ func (x *AccountV2LanguageChangedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AccountV2LanguageChangedEvent.ProtoReflect.Descriptor instead.
func (*AccountV2LanguageChangedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{168}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{169}
}
func (x *AccountV2LanguageChangedEvent) GetEmail() string {
@@ -10907,7 +10995,7 @@ type TagCreatedEvent struct {
func (x *TagCreatedEvent) Reset() {
*x = TagCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[169]
+ mi := &file_proto_event_domain_event_proto_msgTypes[170]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -10920,7 +11008,7 @@ func (x *TagCreatedEvent) String() string {
func (*TagCreatedEvent) ProtoMessage() {}
func (x *TagCreatedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[169]
+ mi := &file_proto_event_domain_event_proto_msgTypes[170]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -10933,7 +11021,7 @@ func (x *TagCreatedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use TagCreatedEvent.ProtoReflect.Descriptor instead.
func (*TagCreatedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{169}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{170}
}
func (x *TagCreatedEvent) GetId() string {
@@ -10968,7 +11056,7 @@ func (x *TagCreatedEvent) GetEntityType() tag.Tag_EntityType {
if x != nil {
return x.EntityType
}
- return tag.Tag_UNKNOWN
+ return tag.Tag_UNSPECIFIED
}
func (x *TagCreatedEvent) GetEnvironmentId() string {
@@ -10990,7 +11078,7 @@ type TagDeletedEvent struct {
func (x *TagDeletedEvent) Reset() {
*x = TagDeletedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[170]
+ mi := &file_proto_event_domain_event_proto_msgTypes[171]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -11003,7 +11091,7 @@ func (x *TagDeletedEvent) String() string {
func (*TagDeletedEvent) ProtoMessage() {}
func (x *TagDeletedEvent) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[170]
+ mi := &file_proto_event_domain_event_proto_msgTypes[171]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -11016,7 +11104,7 @@ func (x *TagDeletedEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use TagDeletedEvent.ProtoReflect.Descriptor instead.
func (*TagDeletedEvent) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{170}
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{171}
}
func (x *TagDeletedEvent) GetId() string {
@@ -11033,33 +11121,45 @@ func (x *TagDeletedEvent) GetEnvironmentId() string {
return ""
}
-type Editor_PublicAPIEditor struct {
+type CodeReferenceCreatedEvent struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token"`
- Maintainer string `protobuf:"bytes,2,opt,name=maintainer,proto3" json:"maintainer"`
- Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ FeatureId string `protobuf:"bytes,2,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ FilePath string `protobuf:"bytes,3,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,5,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,6,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,7,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryName string `protobuf:"bytes,8,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,9,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType coderef.CodeReference_RepositoryType `protobuf:"varint,10,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,11,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,12,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+ EnvironmentId string `protobuf:"bytes,13,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ CreatedAt int64 `protobuf:"varint,14,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+ UpdatedAt int64 `protobuf:"varint,15,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
}
-func (x *Editor_PublicAPIEditor) Reset() {
- *x = Editor_PublicAPIEditor{}
+func (x *CodeReferenceCreatedEvent) Reset() {
+ *x = CodeReferenceCreatedEvent{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_event_domain_event_proto_msgTypes[171]
+ mi := &file_proto_event_domain_event_proto_msgTypes[172]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
-func (x *Editor_PublicAPIEditor) String() string {
+func (x *CodeReferenceCreatedEvent) String() string {
return protoimpl.X.MessageStringOf(x)
}
-func (*Editor_PublicAPIEditor) ProtoMessage() {}
+func (*CodeReferenceCreatedEvent) ProtoMessage() {}
-func (x *Editor_PublicAPIEditor) ProtoReflect() protoreflect.Message {
- mi := &file_proto_event_domain_event_proto_msgTypes[171]
+func (x *CodeReferenceCreatedEvent) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_event_domain_event_proto_msgTypes[172]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -11070,316 +11170,643 @@ func (x *Editor_PublicAPIEditor) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
-// Deprecated: Use Editor_PublicAPIEditor.ProtoReflect.Descriptor instead.
-func (*Editor_PublicAPIEditor) Descriptor() ([]byte, []int) {
- return file_proto_event_domain_event_proto_rawDescGZIP(), []int{1, 0}
+// Deprecated: Use CodeReferenceCreatedEvent.ProtoReflect.Descriptor instead.
+func (*CodeReferenceCreatedEvent) Descriptor() ([]byte, []int) {
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{172}
}
-func (x *Editor_PublicAPIEditor) GetToken() string {
+func (x *CodeReferenceCreatedEvent) GetId() string {
if x != nil {
- return x.Token
+ return x.Id
}
return ""
}
-func (x *Editor_PublicAPIEditor) GetMaintainer() string {
+func (x *CodeReferenceCreatedEvent) GetFeatureId() string {
if x != nil {
- return x.Maintainer
+ return x.FeatureId
}
return ""
}
-func (x *Editor_PublicAPIEditor) GetName() string {
+func (x *CodeReferenceCreatedEvent) GetFilePath() string {
if x != nil {
- return x.Name
+ return x.FilePath
}
return ""
}
-var File_proto_event_domain_event_proto protoreflect.FileDescriptor
+func (x *CodeReferenceCreatedEvent) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
-var file_proto_event_domain_event_proto_rawDesc = []byte{
- 0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f,
- 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x12, 0x16, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e,
- 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
- 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x72, 0x75, 0x6c, 0x65,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f,
- 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75,
- 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x72,
- 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74,
- 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x2f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x1a, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f,
- 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70,
- 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x6f,
- 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x66, 0x6c, 0x61, 0x67, 0x5f,
- 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x73, 0x65, 0x61,
- 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x67, 0x2f, 0x74, 0x61, 0x67, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x2f, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
- 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
- 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a,
- 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
- 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x65, 0x6e,
- 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69,
- 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74,
- 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20,
- 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a,
- 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e,
- 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x65,
- 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12,
- 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e,
- 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
- 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e,
- 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
- 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18,
- 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x44, 0x61, 0x74,
- 0x61, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x6e,
- 0x74, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x44,
- 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
- 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76,
- 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x9c, 0x02, 0x0a, 0x0a, 0x45,
- 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x45, 0x41,
- 0x54, 0x55, 0x52, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x01,
- 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02,
- 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0a, 0x0a,
- 0x06, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x47,
- 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f,
- 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x44, 0x4d, 0x49, 0x4e,
- 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x55,
- 0x54, 0x4f, 0x4f, 0x50, 0x53, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04,
- 0x50, 0x55, 0x53, 0x48, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52,
- 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x4d, 0x49,
- 0x4e, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0b,
- 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x0c, 0x12, 0x17, 0x0a,
- 0x13, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c,
- 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49,
- 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, 0x41, 0x47,
- 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41,
- 0x47, 0x10, 0x11, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0d, 0x22, 0xc6, 0x28, 0x0a, 0x04, 0x54, 0x79,
- 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
- 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54,
- 0x45, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f,
- 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41,
- 0x54, 0x55, 0x52, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x14,
- 0x0a, 0x10, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c,
- 0x45, 0x44, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f,
- 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41,
- 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e,
- 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x08, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45,
- 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
- 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x45, 0x41, 0x54, 0x55,
- 0x52, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d,
- 0x4f, 0x56, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52,
- 0x45, 0x5f, 0x4f, 0x46, 0x46, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
- 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x41, 0x52,
- 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x43, 0x48, 0x41,
- 0x4e, 0x47, 0x45, 0x44, 0x10, 0x0c, 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54,
- 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
- 0x10, 0x0d, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
- 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e,
- 0x47, 0x45, 0x44, 0x10, 0x0e, 0x12, 0x18, 0x0a, 0x14, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49,
- 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x0f, 0x12,
- 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45,
- 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x10, 0x12, 0x16, 0x0a, 0x12, 0x46,
- 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45,
- 0x44, 0x10, 0x11, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52,
- 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41,
- 0x4e, 0x47, 0x45, 0x44, 0x10, 0x12, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52,
- 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x13,
- 0x12, 0x15, 0x0a, 0x11, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f,
- 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x55, 0x4c, 0x45, 0x5f,
- 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x15,
- 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x53,
- 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
- 0x16, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55,
- 0x54, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47,
- 0x45, 0x44, 0x10, 0x17, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41,
- 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
- 0x10, 0x18, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4f, 0x50, 0x45,
- 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x19, 0x12,
- 0x16, 0x0a, 0x12, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f,
- 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x1a, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4c, 0x41, 0x55, 0x53,
- 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10,
- 0x1b, 0x12, 0x24, 0x0a, 0x20, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x46,
- 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48,
- 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x1c, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x45, 0x41, 0x54, 0x55,
- 0x52, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x1d, 0x12, 0x17,
- 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x52, 0x45,
- 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x1e, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41, 0x54, 0x55,
- 0x52, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45,
- 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x45, 0x41, 0x54,
- 0x55, 0x52, 0x45, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x20, 0x12, 0x12,
- 0x0a, 0x0e, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x4e, 0x45, 0x44,
- 0x10, 0x21, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e,
- 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x23, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x41,
- 0x4d, 0x50, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x45,
- 0x54, 0x10, 0x22, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x55, 0x49, 0x53,
- 0x49, 0x54, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x24, 0x12, 0x18, 0x0a, 0x14, 0x50,
- 0x52, 0x45, 0x52, 0x45, 0x51, 0x55, 0x49, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f,
- 0x56, 0x45, 0x44, 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x55,
- 0x49, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
- 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x26, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41,
- 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52,
- 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x27, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45,
- 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x28, 0x12,
- 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10,
- 0x64, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45,
- 0x44, 0x10, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x44, 0x45, 0x53, 0x43,
- 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
- 0x66, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45,
- 0x44, 0x10, 0x67, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x41, 0x52, 0x43, 0x48,
- 0x49, 0x56, 0x45, 0x44, 0x10, 0x68, 0x12, 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49,
- 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xc8, 0x01, 0x12,
- 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54,
- 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0xc9, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x45,
- 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x54, 0x5f,
- 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xca, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x45, 0x58,
- 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x54,
- 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xcb, 0x01, 0x12, 0x17, 0x0a, 0x12, 0x45,
- 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45,
- 0x44, 0x10, 0xcc, 0x01, 0x12, 0x1e, 0x0a, 0x19, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45,
- 0x4e, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
- 0x44, 0x10, 0xcd, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45,
- 0x4e, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
- 0xce, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54,
- 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41,
- 0x4e, 0x47, 0x45, 0x44, 0x10, 0xcf, 0x01, 0x12, 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52,
- 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0xd0, 0x01,
- 0x12, 0x18, 0x0a, 0x13, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46,
- 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0xd1, 0x01, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x58,
- 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45,
- 0x44, 0x10, 0xd2, 0x01, 0x12, 0x18, 0x0a, 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f,
- 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xac, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x1d,
- 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43,
- 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xad, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x18, 0x0a,
- 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44,
- 0x10, 0xae, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55,
- 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0xaf, 0x02, 0x1a, 0x02,
- 0x08, 0x01, 0x12, 0x18, 0x0a, 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x45,
- 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xb0, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x17, 0x0a, 0x12,
- 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54,
- 0x45, 0x44, 0x10, 0xb1, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54,
- 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
- 0x10, 0xb2, 0x02, 0x12, 0x28, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56,
- 0x32, 0x5f, 0x41, 0x56, 0x41, 0x54, 0x41, 0x52, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x55,
- 0x52, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xb3, 0x02, 0x12, 0x29, 0x0a,
- 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4f, 0x52, 0x47, 0x41,
- 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x48,
- 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xb4, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f,
- 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45,
- 0x4e, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
- 0x10, 0xb5, 0x02, 0x12, 0x17, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56,
- 0x32, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0xb6, 0x02, 0x12, 0x18, 0x0a, 0x13,
- 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42,
- 0x4c, 0x45, 0x44, 0x10, 0xb7, 0x02, 0x12, 0x17, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
- 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xb8, 0x02, 0x12,
- 0x25, 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x52,
- 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c,
- 0x54, 0x45, 0x52, 0x10, 0xb9, 0x02, 0x12, 0x2a, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
- 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54,
- 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4e, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
- 0xba, 0x02, 0x12, 0x2b, 0x0a, 0x26, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32,
- 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x51,
- 0x55, 0x45, 0x52, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbb, 0x02, 0x12,
- 0x2d, 0x0a, 0x28, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45,
- 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x46, 0x41,
- 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbc, 0x02, 0x12, 0x25,
- 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45, 0x41,
- 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54,
- 0x45, 0x44, 0x10, 0xbd, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54,
- 0x5f, 0x56, 0x32, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43,
- 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbe, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x41, 0x43, 0x43,
- 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d,
- 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbf, 0x02, 0x12, 0x20, 0x0a, 0x1b,
- 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4c, 0x41, 0x4e, 0x47, 0x55,
- 0x41, 0x47, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xc0, 0x02, 0x12, 0x17,
- 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x55, 0x50, 0x44,
- 0x41, 0x54, 0x45, 0x44, 0x10, 0xc1, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55,
- 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47,
- 0x45, 0x44, 0x10, 0xc2, 0x02, 0x12, 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f,
- 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x90, 0x03, 0x12, 0x18, 0x0a, 0x13, 0x41, 0x50,
- 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
- 0x44, 0x10, 0x91, 0x03, 0x12, 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x45,
- 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x92, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x41, 0x50, 0x49,
- 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x93, 0x03, 0x12,
- 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
- 0x44, 0x10, 0x94, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f,
- 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xf4, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45,
- 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xf5, 0x03,
- 0x12, 0x19, 0x0a, 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45,
- 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xf6, 0x03, 0x12, 0x20, 0x0a, 0x1b, 0x53,
- 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49,
- 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xf7, 0x03, 0x12, 0x17, 0x0a,
- 0x12, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x44,
- 0x44, 0x45, 0x44, 0x10, 0xf8, 0x03, 0x12, 0x19, 0x0a, 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e,
- 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xf9,
- 0x03, 0x12, 0x1e, 0x0a, 0x19, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c,
- 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0xfa,
- 0x03, 0x12, 0x20, 0x0a, 0x1b, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c,
- 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44,
- 0x10, 0xfb, 0x03, 0x12, 0x25, 0x0a, 0x20, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43,
- 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f,
- 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xfc, 0x03, 0x12, 0x24, 0x0a, 0x1f, 0x53, 0x45,
- 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4f, 0x50, 0x45,
- 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xfd, 0x03,
- 0x12, 0x1f, 0x0a, 0x1a, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x55,
- 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0xfe,
- 0x03, 0x12, 0x21, 0x0a, 0x1c, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41,
- 0x55, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45,
- 0x44, 0x10, 0xff, 0x03, 0x12, 0x17, 0x0a, 0x12, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f,
- 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x80, 0x04, 0x12, 0x19, 0x0a,
- 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x45,
- 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x81, 0x04, 0x12, 0x1e, 0x0a, 0x19, 0x53, 0x45, 0x47, 0x4d,
- 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x55, 0x4c, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f,
- 0x55, 0x53, 0x45, 0x52, 0x53, 0x10, 0x82, 0x04, 0x12, 0x2d, 0x0a, 0x28, 0x53, 0x45, 0x47, 0x4d,
- 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x55, 0x4c, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f,
- 0x55, 0x53, 0x45, 0x52, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x48, 0x41,
- 0x4e, 0x47, 0x45, 0x44, 0x10, 0x83, 0x04, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x47, 0x4d, 0x45,
- 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x84, 0x04, 0x12, 0x18, 0x0a,
- 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45,
- 0x41, 0x54, 0x45, 0x44, 0x10, 0xd8, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52,
- 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, 0xd9,
- 0x04, 0x12, 0x24, 0x0a, 0x1f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54,
- 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41,
- 0x4e, 0x47, 0x45, 0x44, 0x10, 0xda, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52,
- 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xdb,
+func (x *CodeReferenceCreatedEvent) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *CodeReferenceCreatedEvent) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetRepositoryType() coderef.CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return coderef.CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *CodeReferenceCreatedEvent) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *CodeReferenceCreatedEvent) GetCreatedAt() int64 {
+ if x != nil {
+ return x.CreatedAt
+ }
+ return 0
+}
+
+func (x *CodeReferenceCreatedEvent) GetUpdatedAt() int64 {
+ if x != nil {
+ return x.UpdatedAt
+ }
+ return 0
+}
+
+type CodeReferenceUpdatedEvent struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ FilePath string `protobuf:"bytes,2,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,3,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,4,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,5,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,6,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryBranch string `protobuf:"bytes,7,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,8,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+ EnvironmentId string `protobuf:"bytes,9,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ UpdatedAt int64 `protobuf:"varint,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+}
+
+func (x *CodeReferenceUpdatedEvent) Reset() {
+ *x = CodeReferenceUpdatedEvent{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_event_domain_event_proto_msgTypes[173]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CodeReferenceUpdatedEvent) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CodeReferenceUpdatedEvent) ProtoMessage() {}
+
+func (x *CodeReferenceUpdatedEvent) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_event_domain_event_proto_msgTypes[173]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CodeReferenceUpdatedEvent.ProtoReflect.Descriptor instead.
+func (*CodeReferenceUpdatedEvent) Descriptor() ([]byte, []int) {
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{173}
+}
+
+func (x *CodeReferenceUpdatedEvent) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *CodeReferenceUpdatedEvent) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *CodeReferenceUpdatedEvent) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *CodeReferenceUpdatedEvent) GetUpdatedAt() int64 {
+ if x != nil {
+ return x.UpdatedAt
+ }
+ return 0
+}
+
+type CodeReferenceDeletedEvent struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+}
+
+func (x *CodeReferenceDeletedEvent) Reset() {
+ *x = CodeReferenceDeletedEvent{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_event_domain_event_proto_msgTypes[174]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CodeReferenceDeletedEvent) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CodeReferenceDeletedEvent) ProtoMessage() {}
+
+func (x *CodeReferenceDeletedEvent) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_event_domain_event_proto_msgTypes[174]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CodeReferenceDeletedEvent.ProtoReflect.Descriptor instead.
+func (*CodeReferenceDeletedEvent) Descriptor() ([]byte, []int) {
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{174}
+}
+
+func (x *CodeReferenceDeletedEvent) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *CodeReferenceDeletedEvent) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+type Editor_PublicAPIEditor struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token"`
+ Maintainer string `protobuf:"bytes,2,opt,name=maintainer,proto3" json:"maintainer"`
+ Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name"`
+}
+
+func (x *Editor_PublicAPIEditor) Reset() {
+ *x = Editor_PublicAPIEditor{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_event_domain_event_proto_msgTypes[175]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Editor_PublicAPIEditor) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Editor_PublicAPIEditor) ProtoMessage() {}
+
+func (x *Editor_PublicAPIEditor) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_event_domain_event_proto_msgTypes[175]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Editor_PublicAPIEditor.ProtoReflect.Descriptor instead.
+func (*Editor_PublicAPIEditor) Descriptor() ([]byte, []int) {
+ return file_proto_event_domain_event_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *Editor_PublicAPIEditor) GetToken() string {
+ if x != nil {
+ return x.Token
+ }
+ return ""
+}
+
+func (x *Editor_PublicAPIEditor) GetMaintainer() string {
+ if x != nil {
+ return x.Maintainer
+ }
+ return ""
+}
+
+func (x *Editor_PublicAPIEditor) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+var File_proto_event_domain_event_proto protoreflect.FileDescriptor
+
+var file_proto_event_domain_event_proto_rawDesc = []byte{
+ 0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f,
+ 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x12, 0x16, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x2f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+ 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x72, 0x75, 0x6c, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x2f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f,
+ 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75,
+ 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x72,
+ 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x1a, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f,
+ 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70,
+ 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x66, 0x6c, 0x61, 0x67, 0x5f,
+ 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x73, 0x65, 0x61,
+ 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x67, 0x2f, 0x74, 0x61, 0x67, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x1a, 0x22, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65,
+ 0x66, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf6, 0x2f, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49,
+ 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x36,
+ 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x06,
+ 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61,
+ 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65,
+ 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69,
+ 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61,
+ 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x44, 0x61,
+ 0x74, 0x61, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x44, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa9, 0x02, 0x0a, 0x0a,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x45,
+ 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x4f, 0x41, 0x4c, 0x10,
+ 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x10,
+ 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0a,
+ 0x0a, 0x06, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45,
+ 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4e, 0x56, 0x49, 0x52,
+ 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x44, 0x4d, 0x49,
+ 0x4e, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x41,
+ 0x55, 0x54, 0x4f, 0x4f, 0x50, 0x53, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a,
+ 0x04, 0x50, 0x55, 0x53, 0x48, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x55, 0x42, 0x53, 0x43,
+ 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x4d,
+ 0x49, 0x4e, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10,
+ 0x0b, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x0c, 0x12, 0x17,
+ 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x4f,
+ 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52, 0x47, 0x41, 0x4e,
+ 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, 0x41,
+ 0x47, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x54,
+ 0x41, 0x47, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x44, 0x45, 0x52, 0x45, 0x46, 0x10,
+ 0x12, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0d, 0x22, 0xaf, 0x29, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65,
+ 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a,
+ 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44,
+ 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45,
+ 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55,
+ 0x52, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10,
+ 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44,
+ 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45,
+ 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41, 0x54, 0x55,
+ 0x52, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43,
+ 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x08, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45, 0x41, 0x54,
+ 0x55, 0x52, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x44,
+ 0x44, 0x45, 0x44, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45,
+ 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56,
+ 0x45, 0x44, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f,
+ 0x4f, 0x46, 0x46, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48,
+ 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x41, 0x52, 0x49, 0x41,
+ 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47,
+ 0x45, 0x44, 0x10, 0x0c, 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f,
+ 0x4e, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x0d,
+ 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45,
+ 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
+ 0x44, 0x10, 0x0e, 0x12, 0x18, 0x0a, 0x14, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e,
+ 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x0f, 0x12, 0x1a, 0x0a,
+ 0x16, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f,
+ 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x10, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x45, 0x41,
+ 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10,
+ 0x11, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4c,
+ 0x45, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47,
+ 0x45, 0x44, 0x10, 0x12, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f,
+ 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x13, 0x12, 0x15,
+ 0x0a, 0x11, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x44,
+ 0x44, 0x45, 0x44, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x43, 0x4c,
+ 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x15, 0x12, 0x1f,
+ 0x0a, 0x1b, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x52,
+ 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x16, 0x12,
+ 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x5f,
+ 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
+ 0x10, 0x17, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x54, 0x54,
+ 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x18,
+ 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41,
+ 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x19, 0x12, 0x16, 0x0a,
+ 0x12, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x41, 0x44,
+ 0x44, 0x45, 0x44, 0x10, 0x1a, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f,
+ 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x1b, 0x12,
+ 0x24, 0x0a, 0x20, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55,
+ 0x4c, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e,
+ 0x47, 0x45, 0x44, 0x10, 0x1c, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45,
+ 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x1d, 0x12, 0x17, 0x0a, 0x13,
+ 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x52, 0x45, 0x4d, 0x4f,
+ 0x56, 0x45, 0x44, 0x10, 0x1e, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45,
+ 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45,
+ 0x4e, 0x54, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52,
+ 0x45, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x20, 0x12, 0x12, 0x0a, 0x0e,
+ 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x21,
+ 0x12, 0x16, 0x0a, 0x12, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x52,
+ 0x43, 0x48, 0x49, 0x56, 0x45, 0x44, 0x10, 0x23, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x41, 0x4d, 0x50,
+ 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10,
+ 0x22, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x55, 0x49, 0x53, 0x49, 0x54,
+ 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x24, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45,
+ 0x52, 0x45, 0x51, 0x55, 0x49, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45,
+ 0x44, 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x55, 0x49, 0x53,
+ 0x49, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48,
+ 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x26, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x45, 0x41, 0x54, 0x55,
+ 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x43,
+ 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x27, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x45, 0x41, 0x54,
+ 0x55, 0x52, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x28, 0x12, 0x10, 0x0a,
+ 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x64, 0x12,
+ 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10,
+ 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49,
+ 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x66, 0x12,
+ 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10,
+ 0x67, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56,
+ 0x45, 0x44, 0x10, 0x68, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x55, 0x50, 0x44,
+ 0x41, 0x54, 0x45, 0x44, 0x10, 0x69, 0x12, 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49,
+ 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xc8, 0x01, 0x12,
+ 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54,
+ 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0xc9, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x45,
+ 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x54, 0x5f,
+ 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xca, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x45, 0x58,
+ 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x54,
+ 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xcb, 0x01, 0x12, 0x17, 0x0a, 0x12, 0x45,
+ 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45,
+ 0x44, 0x10, 0xcc, 0x01, 0x12, 0x1e, 0x0a, 0x19, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45,
+ 0x4e, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
+ 0x44, 0x10, 0xcd, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45,
+ 0x4e, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
+ 0xce, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54,
+ 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41,
+ 0x4e, 0x47, 0x45, 0x44, 0x10, 0xcf, 0x01, 0x12, 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52,
+ 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0xd0, 0x01,
+ 0x12, 0x18, 0x0a, 0x13, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46,
+ 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0xd1, 0x01, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x58,
+ 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45,
+ 0x44, 0x10, 0xd2, 0x01, 0x12, 0x18, 0x0a, 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f,
+ 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xac, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x1d,
+ 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43,
+ 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xad, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x18, 0x0a,
+ 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44,
+ 0x10, 0xae, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55,
+ 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0xaf, 0x02, 0x1a, 0x02,
+ 0x08, 0x01, 0x12, 0x18, 0x0a, 0x0f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x45,
+ 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xb0, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x17, 0x0a, 0x12,
+ 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54,
+ 0x45, 0x44, 0x10, 0xb1, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54,
+ 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
+ 0x10, 0xb2, 0x02, 0x12, 0x28, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56,
+ 0x32, 0x5f, 0x41, 0x56, 0x41, 0x54, 0x41, 0x52, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x55,
+ 0x52, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xb3, 0x02, 0x12, 0x29, 0x0a,
+ 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4f, 0x52, 0x47, 0x41,
+ 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x48,
+ 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xb4, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f,
+ 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45,
+ 0x4e, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44,
+ 0x10, 0xb5, 0x02, 0x12, 0x17, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56,
+ 0x32, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0xb6, 0x02, 0x12, 0x18, 0x0a, 0x13,
+ 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42,
+ 0x4c, 0x45, 0x44, 0x10, 0xb7, 0x02, 0x12, 0x17, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
+ 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xb8, 0x02, 0x12,
+ 0x25, 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x52,
+ 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c,
+ 0x54, 0x45, 0x52, 0x10, 0xb9, 0x02, 0x12, 0x2a, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
+ 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54,
+ 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4e, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10,
+ 0xba, 0x02, 0x12, 0x2b, 0x0a, 0x26, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32,
+ 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x51,
+ 0x55, 0x45, 0x52, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbb, 0x02, 0x12,
+ 0x2d, 0x0a, 0x28, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45,
+ 0x41, 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x46, 0x41,
+ 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbc, 0x02, 0x12, 0x25,
+ 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x53, 0x45, 0x41,
+ 0x52, 0x43, 0x48, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54,
+ 0x45, 0x44, 0x10, 0xbd, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54,
+ 0x5f, 0x56, 0x32, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43,
+ 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbe, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x41, 0x43, 0x43,
+ 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d,
+ 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xbf, 0x02, 0x12, 0x20, 0x0a, 0x1b,
+ 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x4c, 0x41, 0x4e, 0x47, 0x55,
+ 0x41, 0x47, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xc0, 0x02, 0x12, 0x17,
+ 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x55, 0x50, 0x44,
+ 0x41, 0x54, 0x45, 0x44, 0x10, 0xc1, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55,
+ 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x41, 0x47, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47,
+ 0x45, 0x44, 0x10, 0xc2, 0x02, 0x12, 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f,
+ 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x90, 0x03, 0x12, 0x18, 0x0a, 0x13, 0x41, 0x50,
+ 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
+ 0x44, 0x10, 0x91, 0x03, 0x12, 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x45,
+ 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x92, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x41, 0x50, 0x49,
+ 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x93, 0x03, 0x12,
+ 0x13, 0x0a, 0x0e, 0x41, 0x50, 0x49, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45,
+ 0x44, 0x10, 0x94, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f,
+ 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xf4, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45,
+ 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xf5, 0x03,
+ 0x12, 0x19, 0x0a, 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45,
+ 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xf6, 0x03, 0x12, 0x20, 0x0a, 0x1b, 0x53,
+ 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49,
+ 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xf7, 0x03, 0x12, 0x17, 0x0a,
+ 0x12, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x44,
+ 0x44, 0x45, 0x44, 0x10, 0xf8, 0x03, 0x12, 0x19, 0x0a, 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e,
+ 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xf9,
+ 0x03, 0x12, 0x1e, 0x0a, 0x19, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c,
+ 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0xfa,
+ 0x03, 0x12, 0x20, 0x0a, 0x1b, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4c,
+ 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44,
+ 0x10, 0xfb, 0x03, 0x12, 0x25, 0x0a, 0x20, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43,
+ 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f,
+ 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xfc, 0x03, 0x12, 0x24, 0x0a, 0x1f, 0x53, 0x45,
+ 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4f, 0x50, 0x45,
+ 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0xfd, 0x03,
+ 0x12, 0x1f, 0x0a, 0x1a, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x55,
+ 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0xfe,
+ 0x03, 0x12, 0x21, 0x0a, 0x1c, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x41,
+ 0x55, 0x53, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45,
+ 0x44, 0x10, 0xff, 0x03, 0x12, 0x17, 0x0a, 0x12, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f,
+ 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x80, 0x04, 0x12, 0x19, 0x0a,
+ 0x14, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x45,
+ 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x81, 0x04, 0x12, 0x1e, 0x0a, 0x19, 0x53, 0x45, 0x47, 0x4d,
+ 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x55, 0x4c, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f,
+ 0x55, 0x53, 0x45, 0x52, 0x53, 0x10, 0x82, 0x04, 0x12, 0x2d, 0x0a, 0x28, 0x53, 0x45, 0x47, 0x4d,
+ 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x55, 0x4c, 0x4b, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f,
+ 0x55, 0x53, 0x45, 0x52, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x48, 0x41,
+ 0x4e, 0x47, 0x45, 0x44, 0x10, 0x83, 0x04, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x45, 0x47, 0x4d, 0x45,
+ 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x84, 0x04, 0x12, 0x18, 0x0a,
+ 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45,
+ 0x41, 0x54, 0x45, 0x44, 0x10, 0xd8, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52,
+ 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, 0xd9,
+ 0x04, 0x12, 0x24, 0x0a, 0x1f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54,
+ 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41,
+ 0x4e, 0x47, 0x45, 0x44, 0x10, 0xda, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x45, 0x4e, 0x56, 0x49, 0x52,
+ 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xdb,
0x04, 0x12, 0x1b, 0x0a, 0x16, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54,
0x5f, 0x56, 0x32, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xdc, 0x04, 0x12, 0x1b,
0x0a, 0x16, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x32,
@@ -11514,641 +11941,652 @@ var file_proto_event_domain_event_proto_rawDesc = []byte{
0x41, 0x47, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0xc7, 0x0c, 0x12, 0x10,
0x0a, 0x0b, 0x54, 0x41, 0x47, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0xa5, 0x0d,
0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10,
- 0xa6, 0x0d, 0x22, 0x06, 0x08, 0x94, 0x0a, 0x10, 0x94, 0x0a, 0x22, 0x06, 0x08, 0x95, 0x0a, 0x10,
- 0x95, 0x0a, 0x22, 0x06, 0x08, 0x96, 0x0a, 0x10, 0x96, 0x0a, 0x22, 0x06, 0x08, 0x97, 0x0a, 0x10,
- 0x97, 0x0a, 0x22, 0x06, 0x08, 0x98, 0x0a, 0x10, 0x98, 0x0a, 0x22, 0x06, 0x08, 0x99, 0x0a, 0x10,
- 0x99, 0x0a, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x8c, 0x02, 0x0a, 0x06, 0x45, 0x64, 0x69,
- 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f,
- 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x41,
- 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x11, 0x70, 0x75, 0x62, 0x6c,
- 0x69, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x64, 0x69,
- 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x50, 0x49, 0x45, 0x64, 0x69,
- 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x70, 0x69, 0x45, 0x64,
- 0x69, 0x74, 0x6f, 0x72, 0x1a, 0x5b, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x50,
- 0x49, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a,
- 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x44, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b,
- 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x05, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xf3, 0x04,
- 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
- 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
- 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75,
- 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12,
- 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a,
- 0x1a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x69,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17,
- 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5a, 0x0a, 0x1b, 0x64, 0x65, 0x66, 0x61, 0x75,
- 0x6c, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49,
- 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75,
- 0x6c, 0x74, 0x4f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
- 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x72,
- 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65,
- 0x52, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12,
- 0x2d, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x33,
- 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67,
- 0x65, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x55, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x04, 0x64, 0x61,
- 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x64, 0x61,
- 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x64,
- 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70,
- 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x25, 0x0a, 0x13, 0x46,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x69, 0x73,
- 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x46, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x22, 0x28, 0x0a, 0x16, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x55, 0x6e, 0x61,
- 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x13,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x1b, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x1d, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65,
- 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
- 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52,
- 0x0a, 0x1e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0xa6, 0x0d, 0x12, 0x1b, 0x0a, 0x16, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52,
+ 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x88, 0x0e, 0x12,
+ 0x1b, 0x0a, 0x16, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43,
+ 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x89, 0x0e, 0x12, 0x1b, 0x0a, 0x16,
+ 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x44,
+ 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x8a, 0x0e, 0x22, 0x06, 0x08, 0x94, 0x0a, 0x10, 0x94,
+ 0x0a, 0x22, 0x06, 0x08, 0x95, 0x0a, 0x10, 0x95, 0x0a, 0x22, 0x06, 0x08, 0x96, 0x0a, 0x10, 0x96,
+ 0x0a, 0x22, 0x06, 0x08, 0x97, 0x0a, 0x10, 0x97, 0x0a, 0x22, 0x06, 0x08, 0x98, 0x0a, 0x10, 0x98,
+ 0x0a, 0x22, 0x06, 0x08, 0x99, 0x0a, 0x10, 0x99, 0x0a, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22,
+ 0x8c, 0x02, 0x0a, 0x06, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d,
+ 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x5a, 0x0a, 0x11, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x65, 0x64,
+ 0x69, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x6f, 0x6d,
+ 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69,
+ 0x63, 0x41, 0x50, 0x49, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c,
+ 0x69, 0x63, 0x41, 0x70, 0x69, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x1a, 0x5b, 0x0a, 0x0f, 0x50,
+ 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x50, 0x49, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x14,
+ 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x44,
+ 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xf3, 0x04, 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x1f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4f, 0x66, 0x66,
- 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72,
- 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x66,
- 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x1a, 0x46, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64,
- 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56,
- 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x72, 0x69,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x61, 0x0a, 0x1a, 0x56, 0x61, 0x72, 0x69, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x1a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f,
+ 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64,
+ 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x6e,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5a,
+ 0x0a, 0x1b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61,
+ 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x0e, 0x76, 0x61,
+ 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x76, 0x61,
+ 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74,
+ 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
+ 0x45, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73,
+ 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65,
+ 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18,
+ 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
+ 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65,
+ 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x16, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x02, 0x18, 0x01, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x72, 0x65,
+ 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x44, 0x61,
+ 0x74, 0x61, 0x22, 0x25, 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x6e, 0x61,
+ 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x22, 0x26, 0x0a, 0x14, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x41, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x28, 0x0a, 0x16, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x13, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x1b, 0x45, 0x76,
+ 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x61, 0x62, 0x6c,
+ 0x65, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x1d, 0x45, 0x76, 0x61,
+ 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x61, 0x62,
+ 0x6c, 0x65, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x13, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x1e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x1f, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x4f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d,
+ 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x68, 0x0a, 0x1a, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+ 0x3a, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1c, 0x46,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+ 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76,
+ 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0b, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x61,
+ 0x0a, 0x1a, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x5e, 0x0a, 0x19, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61,
+ 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x22, 0x73, 0x0a, 0x20, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x19, 0x56, 0x61,
- 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x73, 0x0a, 0x20, 0x56, 0x61,
- 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d,
- 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a,
- 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22,
- 0x5c, 0x0a, 0x17, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72,
- 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65,
- 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x5e, 0x0a,
- 0x19, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
- 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65,
- 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x54, 0x0a,
- 0x15, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72,
- 0x75, 0x6c, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x1e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
- 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x37,
- 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73,
- 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x59, 0x0a, 0x1d, 0x46, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f,
- 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x49,
- 0x64, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x75, 0x6c,
- 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a,
- 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
- 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75,
- 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c,
- 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53,
- 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
- 0x79, 0x22, 0x9c, 0x01, 0x0a, 0x22, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c,
- 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f,
- 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64,
- 0x12, 0x3e, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74,
- 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
- 0x22, 0x81, 0x01, 0x0a, 0x14, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41,
- 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49,
- 0x64, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x06, 0x63, 0x6c,
- 0x61, 0x75, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x16, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75,
- 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d,
- 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a,
- 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
- 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x43, 0x6c, 0x61, 0x75, 0x73,
- 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e,
- 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c,
- 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0xa4, 0x01, 0x0a,
- 0x1a, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75,
- 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c,
- 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65,
- 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61,
- 0x74, 0x6f, 0x72, 0x22, 0x75, 0x0a, 0x15, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c,
- 0x75, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72,
- 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75,
- 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x77, 0x0a, 0x17, 0x43, 0x6c,
- 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x17, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x75, 0x73, 0x65, 0x72, 0x22, 0x5e, 0x0a, 0x19, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x75, 0x73, 0x65, 0x72, 0x22, 0x54, 0x0a, 0x15, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52,
+ 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a,
+ 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
+ 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x1e, 0x46,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65,
+ 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
+ 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+ 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
+ 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61,
+ 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x59,
+ 0x0a, 0x1d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x4f, 0x72,
+ 0x64, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x19,
+ 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x98, 0x01,
+ 0x0a, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x74,
+ 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
+ 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x74,
+ 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x2e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08,
+ 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x9c, 0x01, 0x0a, 0x22, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74,
+ 0x65, 0x67, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17,
+ 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74,
+ 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73,
+ 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x14, 0x52, 0x75, 0x6c, 0x65,
+ 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12,
+ 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x75,
+ 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x43, 0x6c, 0x61,
+ 0x75, 0x73, 0x65, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x16, 0x52,
+ 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a,
- 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
- 0x6c, 0x75, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65,
- 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x68, 0x61,
- 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x74, 0x72,
- 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65,
- 0x67, 0x79, 0x22, 0x38, 0x0a, 0x14, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x67,
- 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61,
- 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x3a, 0x0a, 0x16,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x4a, 0x0a, 0x1e, 0x46, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d,
- 0x65, 0x6e, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65,
- 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72,
- 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb5, 0x04, 0x0a, 0x12, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
- 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
- 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,
- 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72,
- 0x67, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75,
- 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73,
- 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61,
- 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6f,
- 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04,
- 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e,
- 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61,
- 0x69, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62,
+ 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x83, 0x01,
+ 0x0a, 0x1b, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
+ 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+ 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x1a, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x4f, 0x70,
+ 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
+ 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x6f, 0x70,
+ 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75,
- 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0d, 0x70,
- 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0x44, 0x0a, 0x1d,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x53,
- 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a,
- 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x65,
- 0x65, 0x64, 0x22, 0xb0, 0x01, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64,
- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
- 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
- 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61,
- 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x36, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x6e,
- 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a,
- 0x1b, 0x47, 0x6f, 0x61, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b,
- 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x23,
- 0x0a, 0x11, 0x47, 0x6f, 0x61, 0x6c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf3, 0x03, 0x0a, 0x16, 0x45, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
- 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72,
- 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61,
- 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61,
- 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x07, 0x67, 0x6f, 0x61, 0x6c,
- 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x67,
- 0x6f, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61,
- 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74,
- 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f,
- 0x70, 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70,
- 0x70, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61,
- 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
- 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
- 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
- 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
- 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
- 0x12, 0x19, 0x0a, 0x08, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03,
- 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x61, 0x6c, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x62, 0x61,
- 0x73, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x47, 0x0a,
- 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x70,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70,
- 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f,
- 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x22, 0x29, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
- 0x64, 0x22, 0x28, 0x0a, 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44,
- 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1d, 0x45,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74,
- 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08,
- 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
- 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x22, 0x47, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f,
- 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74,
- 0x22, 0x62, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65,
- 0x72, 0x69, 0x6f, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,
+ 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x75, 0x0a, 0x15, 0x43, 0x6c,
+ 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x77, 0x0a, 0x17, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72,
+ 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75,
+ 0x6c, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61,
+ 0x74, 0x65, 0x67, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
- 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73,
- 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74,
- 0x6f, 0x70, 0x41, 0x74, 0x22, 0x40, 0x0a, 0x1a, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x12, 0x37, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52,
+ 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x38, 0x0a, 0x14, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x54, 0x61, 0x67, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+ 0x74, 0x61, 0x67, 0x22, 0x3a, 0x0a, 0x16, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x61,
+ 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a,
+ 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22,
+ 0x4a, 0x0a, 0x1e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb5, 0x04, 0x0a, 0x12,
+ 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x45, 0x76, 0x65,
0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x21, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64,
- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x18, 0x0a,
- 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x22, 0x92, 0x04, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
- 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,
- 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72,
- 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c,
- 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x11, 0x6f, 0x72, 0x67,
- 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x56, 0x32, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28,
- 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63,
- 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e,
- 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52,
- 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65,
- 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a,
- 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
- 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03,
- 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66,
- 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61,
- 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c,
- 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75,
- 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75,
- 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28,
- 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x56, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x56, 0x32, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
- 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22,
- 0x45, 0x0a, 0x19, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4e, 0x61, 0x6d, 0x65,
+ 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+ 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67,
+ 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52,
+ 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
+ 0x79, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65,
+ 0x67, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x66, 0x66, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18,
+ 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d,
+ 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0e, 0x76,
+ 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x76,
+ 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0d,
+ 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x0c, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69,
+ 0x73, 0x69, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69,
+ 0x74, 0x65, 0x73, 0x22, 0x44, 0x0a, 0x1d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x61,
+ 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x65, 0x74, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67,
+ 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x61, 0x6d,
+ 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x10, 0x47, 0x6f,
+ 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x52, 0x0a, 0x0f,
+ 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61,
+ 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,
+ 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,
+ 0x22, 0x94, 0x01, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x52,
+ 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
+ 0x4f, 0x0a, 0x1b, 0x47, 0x6f, 0x61, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20,
+ 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x23, 0x0a, 0x11, 0x47, 0x6f, 0x61, 0x6c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x47, 0x6f, 0x61, 0x6c, 0x44, 0x65, 0x6c,
+ 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf3, 0x03, 0x0a, 0x16, 0x45, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f,
+ 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a,
+ 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a,
+ 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x07, 0x67, 0x6f,
+ 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52,
+ 0x06, 0x67, 0x6f, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73,
+ 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74,
+ 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70,
+ 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
+ 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
+ 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0c,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x61, 0x6c, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f,
+ 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22,
+ 0x47, 0x0a, 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f,
+ 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f,
+ 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73,
+ 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x22, 0x29, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x02, 0x69, 0x64, 0x22, 0x28, 0x0a, 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a,
+ 0x1d, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x41, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19,
+ 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x22, 0x47, 0x0a, 0x1c, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x43, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f,
+ 0x70, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70,
+ 0x41, 0x74, 0x22, 0x62, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x17, 0x0a,
+ 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
+ 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x22, 0x40, 0x0a, 0x1a, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x21, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a,
+ 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x18, 0x0a, 0x16, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61,
+ 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x22, 0x92, 0x04, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x56, 0x32, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14,
+ 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74,
+ 0x61, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55,
+ 0x72, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x11, 0x6f,
+ 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c,
+ 0x65, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f,
+ 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09,
+ 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e,
+ 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e,
+ 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0d, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x56, 0x0a, 0x15, 0x41, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+ 0x64, 0x22, 0x45, 0x0a, 0x19, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4e, 0x61,
+ 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14,
+ 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x23, 0x41, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x56, 0x32, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65,
+ 0x55, 0x52, 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+ 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x22,
+ 0x45, 0x0a, 0x19, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x54, 0x61, 0x67, 0x73,
0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,
- 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x23, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x56, 0x32, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x52,
- 0x4c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a,
+ 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x25, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x56, 0x32, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x5b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e,
+ 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+ 0x6f, 0x6c, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x25, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65,
+ 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a,
0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d,
- 0x61, 0x69, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x69, 0x6d,
- 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61,
- 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x45, 0x0a,
- 0x19, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x54, 0x61, 0x67, 0x73, 0x43, 0x68,
- 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d,
- 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
- 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04,
- 0x74, 0x61, 0x67, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x25, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x56, 0x32, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f,
- 0x6c, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14,
- 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
- 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x5b, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
- 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x52, 0x6f,
- 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
- 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c,
- 0x65, 0x22, 0x98, 0x01, 0x0a, 0x25, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x45,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65,
- 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,
- 0x6c, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
- 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72,
- 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2d, 0x0a, 0x15,
- 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2e, 0x0a, 0x16, 0x41,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2d, 0x0a, 0x15, 0x41,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xd7, 0x01, 0x0a, 0x18, 0x53,
- 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x51,
+ 0x61, 0x69, 0x6c, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+ 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x76,
+ 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2d,
+ 0x0a, 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2e, 0x0a,
+ 0x16, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2d, 0x0a,
+ 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xd7, 0x01, 0x0a,
+ 0x18, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a,
+ 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x51, 0x75,
+ 0x65, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74,
+ 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x54, 0x61,
+ 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12,
+ 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65,
+ 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x1c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
+ 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1d, 0x53, 0x65,
+ 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x51,
0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72,
- 0x79, 0x12, 0x43, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
- 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67,
- 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
- 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a,
- 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,
- 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x46, 0x69,
- 0x6c, 0x74, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x1c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69,
- 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
+ 0x79, 0x22, 0x58, 0x0a, 0x1f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65,
+ 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1d, 0x53, 0x65, 0x61, 0x72,
- 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x68, 0x61,
- 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x65,
- 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22,
- 0x58, 0x0a, 0x1f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x44,
- 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69,
- 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61,
- 0x75, 0x6c, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x18, 0x53, 0x65, 0x61,
- 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xff, 0x01, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x12, 0x32, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x2e, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04,
- 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
- 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e,
- 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x17,
- 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x22, 0x24, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x4b, 0x65,
- 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a,
- 0x16, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f,
+ 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x18, 0x53,
+ 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x12, 0x41,
- 0x50, 0x49, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
- 0x64, 0x22, 0x25, 0x0a, 0x13, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62,
- 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5b, 0x0a, 0x13, 0x53, 0x65, 0x67, 0x6d,
- 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
- 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x13, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a,
- 0x13, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
- 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
- 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xff, 0x01, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x4b,
+ 0x65, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x2e, 0x52, 0x6f, 0x6c, 0x65,
+ 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
+ 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+ 0x12, 0x17, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x22, 0x24, 0x0a, 0x12, 0x41, 0x50, 0x49,
+ 0x4b, 0x65, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22,
+ 0x3c, 0x0a, 0x16, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a,
+ 0x12, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x13, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73,
+ 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5b, 0x0a, 0x13, 0x53, 0x65,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x1e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x15, 0x53, 0x65, 0x67,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22,
- 0x42, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75,
- 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c,
- 0x65, 0x49, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52,
- 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x63,
- 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x74,
- 0x0a, 0x1d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61,
- 0x75, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
- 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17,
- 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73,
- 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75,
- 0x73, 0x65, 0x49, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x22, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73,
- 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75,
- 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c,
- 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64,
- 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0xb8,
- 0x01, 0x0a, 0x21, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65,
- 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
- 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09,
- 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x6f, 0x70, 0x65,
- 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52,
- 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x1c, 0x53, 0x65,
- 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,
- 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x13, 0x53, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x97,
+ 0x01, 0x0a, 0x13, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d,
+ 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x1e, 0x53, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x15, 0x53,
+ 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c,
+ 0x65, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07,
+ 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+ 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a,
+ 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65,
+ 0x22, 0x74, 0x0a, 0x1d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x43,
+ 0x6c, 0x61, 0x75, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
+ 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61,
+ 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c,
+ 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x22, 0x53, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
+ 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+ 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f,
+ 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65,
+ 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x22, 0xb8, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75,
+ 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d,
+ 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b,
+ 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x6f,
+ 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f,
+ 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x1c,
+ 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72,
+ 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75,
+ 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49,
+ 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x53, 0x65, 0x67, 0x6d,
+ 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65,
+ 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65,
0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c,
0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65,
0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12,
0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
- 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x1e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
- 0x74, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x6d, 0x6f,
- 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d,
- 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65,
- 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f,
- 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64,
- 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a,
- 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
- 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55,
- 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a,
- 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08,
- 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
- 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65,
- 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
- 0x61, 0x74, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55,
- 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19,
0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
@@ -12156,580 +12594,653 @@ var file_proto_event_domain_event_proto_rawDesc = []byte{
0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67,
0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05,
- 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
- 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65,
- 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
- 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
- 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53,
- 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xd6, 0x01, 0x0a, 0x28,
- 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61,
- 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d,
- 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65,
- 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
- 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d,
- 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
- 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65,
- 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14,
- 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf4, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
- 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12,
- 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
- 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18,
- 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1d,
- 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a,
- 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
- 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x17, 0x45,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x56, 0x0a, 0x22, 0x45, 0x6e,
- 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
- 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x22, 0x47, 0x0a, 0x17, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a,
- 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x9e, 0x02, 0x0a, 0x19,
- 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x43, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a,
- 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72,
- 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x63,
- 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x72, 0x63,
- 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63,
- 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65,
- 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x01, 0x0a,
- 0x19, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65,
- 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72,
- 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64,
- 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64,
- 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22,
- 0xbb, 0x01, 0x0a, 0x24, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56,
- 0x32, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
+ 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53,
+ 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x67, 0x6d,
+ 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x73, 0x65,
+ 0x72, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x67,
+ 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xd6, 0x01,
+ 0x0a, 0x28, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x55, 0x70, 0x6c,
+ 0x6f, 0x61, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+ 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61,
+ 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55,
+ 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf4, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
+ 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
+ 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a,
+ 0x17, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x61,
+ 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x56, 0x0a, 0x22,
+ 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x47, 0x0a, 0x17, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+ 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x9e, 0x02,
+ 0x0a, 0x19, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61,
+ 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61,
+ 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e,
+ 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80,
+ 0x01, 0x0a, 0x19, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32,
+ 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f,
+ 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,
+ 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d,
+ 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x24, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x56, 0x32, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a,
+ 0x0f, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x95, 0x01, 0x0a, 0x27, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56,
+ 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27,
+ 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
+ 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f,
+ 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70,
+ 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x61, 0x0a, 0x1c, 0x45, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69,
+ 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6f,
- 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e,
- 0x65, 0x77, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01,
- 0x0a, 0x27, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x52,
- 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61,
- 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a,
- 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f,
- 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f,
- 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65,
- 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x61, 0x0a, 0x1c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72,
- 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0xa9, 0x02, 0x0a, 0x17, 0x41, 0x75,
- 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73, 0x54, 0x79,
- 0x70, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x63,
- 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73,
- 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73,
- 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
- 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3f,
- 0x0a, 0x0a, 0x6f, 0x70, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01,
- 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61,
- 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x53, 0x74,
- 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x6f, 0x70, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a,
- 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73,
- 0x52, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x22, 0x19, 0x0a, 0x17, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x44,
- 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x57, 0x0a, 0x1e, 0x41,
- 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x70, 0x73, 0x54, 0x79, 0x70,
- 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a,
- 0x08, 0x6f, 0x70, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
- 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f,
- 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x73,
- 0x54, 0x79, 0x70, 0x65, 0x22, 0x24, 0x0a, 0x22, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52,
- 0x75, 0x6c, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x41, 0x74, 0x43, 0x68,
- 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x20, 0x41, 0x75,
- 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x70, 0x73, 0x53, 0x74, 0x61, 0x74,
- 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f,
- 0x0a, 0x0a, 0x6f, 0x70, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61,
- 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x53, 0x74,
- 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x6f, 0x70, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
- 0x95, 0x01, 0x0a, 0x1c, 0x4f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65,
- 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x58, 0x0a,
- 0x15, 0x6f, 0x70, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f,
- 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73,
- 0x2e, 0x4f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61,
- 0x75, 0x73, 0x65, 0x52, 0x12, 0x6f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74,
- 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x1e, 0x4f, 0x70, 0x73, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x43, 0x68,
- 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c,
- 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
- 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x15, 0x6f, 0x70, 0x73, 0x5f, 0x65,
- 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x12, 0x6f,
- 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73,
- 0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65,
- 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0xa9, 0x02, 0x0a, 0x17,
+ 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x73, 0x5f, 0x74, 0x79,
+ 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a,
+ 0x07, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f,
+ 0x70, 0x73, 0x2e, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x75, 0x73,
+ 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
+ 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x6f, 0x70, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x75, 0x74, 0x6f, 0x4f,
+ 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c,
+ 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x57, 0x0a,
+ 0x1e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x70, 0x73, 0x54,
+ 0x79, 0x70, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75,
+ 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6f,
+ 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x22, 0x24, 0x0a, 0x22, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70,
+ 0x73, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x41, 0x74,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x20,
+ 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x70, 0x73, 0x53, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x6f, 0x70, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x22, 0x95, 0x01, 0x0a, 0x1c, 0x4f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61,
+ 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65,
0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x22,
- 0x83, 0x01, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75,
- 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12,
+ 0x58, 0x0a, 0x15, 0x6f, 0x70, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74,
+ 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f,
+ 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43,
+ 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x12, 0x6f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52,
+ 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x1e, 0x4f, 0x70,
+ 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09,
0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x64, 0x61, 0x74,
- 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61,
- 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43,
- 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43,
- 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69,
- 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
+ 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x15, 0x6f, 0x70, 0x73,
+ 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x75,
+ 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x4f, 0x70, 0x73,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52,
+ 0x12, 0x6f, 0x70, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61,
+ 0x75, 0x73, 0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75,
+ 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49,
- 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6c,
- 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x44,
- 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x0e, 0x64,
- 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x70, 0x0a,
- 0x10, 0x50, 0x75, 0x73, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x63, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
- 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11,
- 0x66, 0x63, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
- 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22,
- 0x12, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x22, 0x28, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x41,
- 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67,
- 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x2a, 0x0a,
- 0x14, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20,
- 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x10, 0x50, 0x75, 0x73,
- 0x68, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x55, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67,
- 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x58, 0x0a,
- 0x10, 0x50, 0x75, 0x73, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
- 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
- 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73,
- 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45,
+ 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c,
+ 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b,
+ 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x64,
+ 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d,
+ 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d,
+ 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x65,
+ 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65,
+ 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x61, 0x75, 0x73,
+ 0x65, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f,
+ 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73,
+ 0x2e, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52,
+ 0x0e, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22,
+ 0x70, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x63, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x11, 0x66, 0x63, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+ 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10,
+ 0x03, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x28, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67,
+ 0x73, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74,
+ 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22,
+ 0x2a, 0x0a, 0x14, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18,
+ 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x10, 0x50,
+ 0x75, 0x73, 0x68, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x50, 0x75, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74,
+ 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22,
+ 0x58, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x53, 0x75,
+ 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65,
+ 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74,
+ 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
+ 0x1a, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44,
+ 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1a, 0x0a, 0x18, 0x53,
+ 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x21, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x41,
+ 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32,
+ 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,
+ 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x79, 0x0a,
+ 0x23, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74,
0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63,
0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75,
- 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69,
- 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x09,
- 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a,
- 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c,
- 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x75, 0x62,
- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x21, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x41, 0x64, 0x64,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e,
+ 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e,
0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b,
- 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x79, 0x0a, 0x23, 0x53,
- 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70,
- 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
- 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x64,
+ 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62,
+ 0x6c, 0x65, 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x69, 0x73,
- 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f,
- 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
- 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79,
- 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
- 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70,
- 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x72,
- 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1f, 0x0a, 0x1d,
- 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1f, 0x0a,
- 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x20,
- 0x0a, 0x1e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x22, 0x7c, 0x0a, 0x26, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73,
- 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e,
- 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74,
- 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70,
- 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x7e,
- 0x0a, 0x28, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e,
- 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74,
- 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70,
- 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x33,
+ 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x63,
+ 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x52,
+ 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1f,
0x0a, 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64,
- 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a,
- 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
- 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x69,
- 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x12,
- 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c,
- 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x45,
- 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
- 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
- 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63, 0x6f,
- 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f, 0x64,
- 0x65, 0x22, 0x52, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x39, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
- 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x22, 0x25, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c,
+ 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22,
+ 0x1f, 0x0a, 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
+ 0x22, 0x20, 0x0a, 0x1e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x22, 0x7c, 0x0a, 0x26, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70,
+ 0x65, 0x73, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
+ 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e,
+ 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54,
+ 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x22, 0x7e, 0x0a, 0x28, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0c,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
+ 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x6e,
+ 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54,
+ 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x22, 0x33, 0x0a, 0x1d, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+ 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a,
+ 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74,
+ 0x72, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69, 0x61,
+ 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61,
+ 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f,
+ 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f,
+ 0x63, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43,
+ 0x6f, 0x64, 0x65, 0x22, 0x52, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x39, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x61,
+ 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x50, 0x72, 0x6f,
+ 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x22, 0x90, 0x02, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69,
+ 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20,
+ 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05,
+ 0x74, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69,
+ 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, 0x6d,
+ 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x6f, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c,
+ 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c,
+ 0x43, 0x6f, 0x64, 0x65, 0x22, 0x2c, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54,
+ 0x72, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x22, 0x5d, 0x0a, 0x16, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69,
+ 0x74, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0c,
+ 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73,
+ 0x69, 0x74, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74,
+ 0x65, 0x22, 0x68, 0x0a, 0x21, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71,
+ 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0c, 0x70,
+ 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x22, 0x39, 0x0a, 0x18, 0x50,
+ 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+ 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x22, 0xfb, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x67, 0x72,
+ 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x75,
+ 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06,
+ 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61,
+ 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69,
+ 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04,
+ 0x74, 0x79, 0x70, 0x65, 0x22, 0xe5, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
+ 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x70,
0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65,
- 0x63, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67,
+ 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x53,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a,
+ 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75,
+ 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76,
+ 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
+ 0x42, 0x79, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x22, 0x30, 0x0a, 0x1e,
+ 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f,
+ 0x75, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x54,
+ 0x0a, 0x31, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c,
+ 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x72, 0x69, 0x67,
+ 0x67, 0x65, 0x72, 0x65, 0x64, 0x41, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75,
+ 0x6c, 0x65, 0x49, 0x64, 0x22, 0xa8, 0x02, 0x0a, 0x18, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63, 0x6f, 0x64,
+ 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f, 0x64, 0x65,
+ 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a,
+ 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72,
+ 0x69, 0x61, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69, 0x61, 0x6c,
+ 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f,
+ 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x22,
+ 0x57, 0x0a, 0x23, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x22, 0x4f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61,
+ 0x69, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f,
+ 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x22,
+ 0x42, 0x0a, 0x1c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+ 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x22, 0x2a, 0x0a, 0x18, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22,
- 0x90, 0x02, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x61, 0x6c,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b,
- 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a,
- 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72,
- 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69, 0x61, 0x6c,
- 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69,
- 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72,
- 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63,
- 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f,
- 0x64, 0x65, 0x22, 0x2c, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69,
- 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
- 0x22, 0x5d, 0x0a, 0x16, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65,
- 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72,
- 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74,
- 0x65, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x22,
- 0x68, 0x0a, 0x21, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x56,
- 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69,
- 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50,
- 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x65,
- 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x22, 0x39, 0x0a, 0x18, 0x50, 0x72, 0x65,
- 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x49, 0x64, 0x22, 0xfb, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
- 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x2b, 0x0a, 0x19, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44,
+ 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x19,
+ 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x1b, 0x4f, 0x72, 0x67,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69,
+ 0x76, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x1f, 0x4f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e,
+ 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xe3, 0x02, 0x0a, 0x17,
+ 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74,
0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75,
0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x63, 0x6c,
- 0x61, 0x75, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
- 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
- 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e,
- 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74,
- 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65,
- 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0xe5, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69,
- 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
- 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65,
- 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x53, 0x74, 0x61,
- 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x0a, 0x73,
- 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
- 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f,
- 0x6f, 0x70, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52,
- 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x42, 0x79,
- 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73,
- 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
- 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x22, 0x30, 0x0a, 0x1e, 0x50, 0x72,
- 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74,
- 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x54, 0x0a, 0x31,
- 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x6f,
- 0x75, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
- 0x72, 0x65, 0x64, 0x41, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
- 0x49, 0x64, 0x22, 0xa8, 0x02, 0x0a, 0x18, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
- 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
- 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20,
- 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,
+ 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69,
+ 0x67, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
+ 0x3d, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e,
+ 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20,
+ 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,
0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01,
- 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08,
- 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,
- 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x69, 0x61,
- 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x1d,
- 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a,
- 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b,
- 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x57, 0x0a,
- 0x23, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73,
+ 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10,
+ 0x04, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
+ 0x72, 0x52, 0x65, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xa2, 0x01,
+ 0x0a, 0x22, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x65, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x22, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69,
- 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c,
- 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b,
- 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x42, 0x0a,
- 0x1c, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d,
- 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x22, 0x2a, 0x0a, 0x18, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
- 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a,
- 0x19, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73,
- 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x19, 0x4f, 0x72,
- 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x1b, 0x4f, 0x72, 0x67, 0x61, 0x6e,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x1f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69,
- 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65,
- 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xe3, 0x02, 0x0a, 0x17, 0x46, 0x6c,
- 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f,
+ 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03,
+ 0x10, 0x04, 0x22, 0x76, 0x0a, 0x18, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
+ 0x72, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a,
+ 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+ 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x75, 0x0a, 0x17, 0x46, 0x6c,
+ 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67,
- 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a,
- 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x41, 0x63,
- 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b,
- 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14,
- 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
- 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
- 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
- 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22,
- 0x89, 0x01, 0x0a, 0x15, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52,
- 0x65, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65,
- 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x25,
- 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
- 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
- 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xa2, 0x01, 0x0a, 0x22,
- 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
- 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
- 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76,
- 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04,
- 0x22, 0x76, 0x0a, 0x18, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44,
- 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10,
+ 0x04, 0x22, 0x75, 0x0a, 0x17, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65,
0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20,
0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
- 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x75, 0x0a, 0x17, 0x46, 0x6c, 0x61, 0x67,
- 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x45, 0x76,
- 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
- 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22,
- 0x75, 0x0a, 0x17, 0x46, 0x6c, 0x61, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76,
- 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xcb, 0x01, 0x0a, 0x1c, 0x46, 0x6c, 0x61,
+ 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74,
+ 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
+ 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x72, 0x69,
+ 0x67, 0x67, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76,
+ 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
- 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xcb, 0x01, 0x0a, 0x1c, 0x46, 0x6c, 0x61, 0x67, 0x54,
- 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74,
- 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74,
- 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64,
- 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5f, 0x74, 0x69,
- 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67,
- 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72,
- 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04,
- 0x08, 0x03, 0x10, 0x04, 0x22, 0x55, 0x0a, 0x1e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
- 0x32, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a,
- 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x1d, 0x41,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65,
- 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
- 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61,
- 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22,
- 0x51, 0x0a, 0x1d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4c, 0x61, 0x6e, 0x67,
- 0x75, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74,
- 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
- 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
- 0x67, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
- 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69,
- 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x74, 0x61, 0x67, 0x2e, 0x54, 0x61,
- 0x67, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x65, 0x6e,
- 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22,
- 0x48, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74,
- 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69,
- 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x55, 0x0a, 0x1e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x56, 0x32, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69,
+ 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d,
+ 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a,
+ 0x1d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4c, 0x61, 0x73, 0x74, 0x4e, 0x61,
+ 0x6d, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14,
+ 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d,
+ 0x65, 0x22, 0x51, 0x0a, 0x1d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x4c, 0x61,
+ 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x1d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x74, 0x61, 0x67, 0x2e,
+ 0x54, 0x61, 0x67, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49,
+ 0x64, 0x22, 0x48, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xc9, 0x04, 0x0a, 0x19,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
+ 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
+ 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65,
+ 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73,
+ 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+ 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07,
+ 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61,
+ 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+ 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77,
+ 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63,
+ 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68,
+ 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61,
+ 0x73, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xdd, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61,
+ 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61,
+ 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+ 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6e, 0x69, 0x70,
+ 0x70, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x53,
+ 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69,
+ 0x61, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61,
+ 0x73, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72,
+ 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10,
+ 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18,
+ 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73,
+ 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x52, 0x0a, 0x19, 0x43, 0x6f, 0x64, 0x65, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45,
+ 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x36, 0x5a, 0x34, 0x67,
+ 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f, 0x6d,
+ 0x61, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -12745,7 +13256,7 @@ func file_proto_event_domain_event_proto_rawDescGZIP() []byte {
}
var file_proto_event_domain_event_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_proto_event_domain_event_proto_msgTypes = make([]protoimpl.MessageInfo, 172)
+var file_proto_event_domain_event_proto_msgTypes = make([]protoimpl.MessageInfo, 176)
var file_proto_event_domain_event_proto_goTypes = []interface{}{
(Event_EntityType)(0), // 0: bucketeer.event.domain.Event.EntityType
(Event_Type)(0), // 1: bucketeer.event.domain.Event.Type
@@ -12790,252 +13301,262 @@ var file_proto_event_domain_event_proto_goTypes = []interface{}{
(*FeatureClonedEvent)(nil), // 40: bucketeer.event.domain.FeatureClonedEvent
(*FeatureSamplingSeedResetEvent)(nil), // 41: bucketeer.event.domain.FeatureSamplingSeedResetEvent
(*GoalCreatedEvent)(nil), // 42: bucketeer.event.domain.GoalCreatedEvent
- (*GoalRenamedEvent)(nil), // 43: bucketeer.event.domain.GoalRenamedEvent
- (*GoalDescriptionChangedEvent)(nil), // 44: bucketeer.event.domain.GoalDescriptionChangedEvent
- (*GoalArchivedEvent)(nil), // 45: bucketeer.event.domain.GoalArchivedEvent
- (*GoalDeletedEvent)(nil), // 46: bucketeer.event.domain.GoalDeletedEvent
- (*ExperimentCreatedEvent)(nil), // 47: bucketeer.event.domain.ExperimentCreatedEvent
- (*ExperimentStoppedEvent)(nil), // 48: bucketeer.event.domain.ExperimentStoppedEvent
- (*ExperimentArchivedEvent)(nil), // 49: bucketeer.event.domain.ExperimentArchivedEvent
- (*ExperimentDeletedEvent)(nil), // 50: bucketeer.event.domain.ExperimentDeletedEvent
- (*ExperimentStartAtChangedEvent)(nil), // 51: bucketeer.event.domain.ExperimentStartAtChangedEvent
- (*ExperimentStopAtChangedEvent)(nil), // 52: bucketeer.event.domain.ExperimentStopAtChangedEvent
- (*ExperimentPeriodChangedEvent)(nil), // 53: bucketeer.event.domain.ExperimentPeriodChangedEvent
- (*ExperimentNameChangedEvent)(nil), // 54: bucketeer.event.domain.ExperimentNameChangedEvent
- (*ExperimentDescriptionChangedEvent)(nil), // 55: bucketeer.event.domain.ExperimentDescriptionChangedEvent
- (*ExperimentStartedEvent)(nil), // 56: bucketeer.event.domain.ExperimentStartedEvent
- (*ExperimentFinishedEvent)(nil), // 57: bucketeer.event.domain.ExperimentFinishedEvent
- (*AccountV2CreatedEvent)(nil), // 58: bucketeer.event.domain.AccountV2CreatedEvent
- (*AccountV2UpdatedEvent)(nil), // 59: bucketeer.event.domain.AccountV2UpdatedEvent
- (*AccountV2NameChangedEvent)(nil), // 60: bucketeer.event.domain.AccountV2NameChangedEvent
- (*AccountV2AvatarImageURLChangedEvent)(nil), // 61: bucketeer.event.domain.AccountV2AvatarImageURLChangedEvent
- (*AccountV2TagsChangedEvent)(nil), // 62: bucketeer.event.domain.AccountV2TagsChangedEvent
- (*AccountV2OrganizationRoleChangedEvent)(nil), // 63: bucketeer.event.domain.AccountV2OrganizationRoleChangedEvent
- (*AccountV2EnvironmentRolesChangedEvent)(nil), // 64: bucketeer.event.domain.AccountV2EnvironmentRolesChangedEvent
- (*AccountV2EnabledEvent)(nil), // 65: bucketeer.event.domain.AccountV2EnabledEvent
- (*AccountV2DisabledEvent)(nil), // 66: bucketeer.event.domain.AccountV2DisabledEvent
- (*AccountV2DeletedEvent)(nil), // 67: bucketeer.event.domain.AccountV2DeletedEvent
- (*SearchFilterCreatedEvent)(nil), // 68: bucketeer.event.domain.SearchFilterCreatedEvent
- (*SearchFilterNameChangedEvent)(nil), // 69: bucketeer.event.domain.SearchFilterNameChangedEvent
- (*SearchFilterQueryChangedEvent)(nil), // 70: bucketeer.event.domain.SearchFilterQueryChangedEvent
- (*SearchFilterDefaultChangedEvent)(nil), // 71: bucketeer.event.domain.SearchFilterDefaultChangedEvent
- (*SearchFilterDeletedEvent)(nil), // 72: bucketeer.event.domain.SearchFilterDeletedEvent
- (*APIKeyCreatedEvent)(nil), // 73: bucketeer.event.domain.APIKeyCreatedEvent
- (*APIKeyChangedEvent)(nil), // 74: bucketeer.event.domain.APIKeyChangedEvent
- (*APIKeyNameChangedEvent)(nil), // 75: bucketeer.event.domain.APIKeyNameChangedEvent
- (*APIKeyEnabledEvent)(nil), // 76: bucketeer.event.domain.APIKeyEnabledEvent
- (*APIKeyDisabledEvent)(nil), // 77: bucketeer.event.domain.APIKeyDisabledEvent
- (*SegmentCreatedEvent)(nil), // 78: bucketeer.event.domain.SegmentCreatedEvent
- (*SegmentDeletedEvent)(nil), // 79: bucketeer.event.domain.SegmentDeletedEvent
- (*SegmentUpdatedEvent)(nil), // 80: bucketeer.event.domain.SegmentUpdatedEvent
- (*SegmentNameChangedEvent)(nil), // 81: bucketeer.event.domain.SegmentNameChangedEvent
- (*SegmentDescriptionChangedEvent)(nil), // 82: bucketeer.event.domain.SegmentDescriptionChangedEvent
- (*SegmentRuleAddedEvent)(nil), // 83: bucketeer.event.domain.SegmentRuleAddedEvent
- (*SegmentRuleDeletedEvent)(nil), // 84: bucketeer.event.domain.SegmentRuleDeletedEvent
- (*SegmentRuleClauseAddedEvent)(nil), // 85: bucketeer.event.domain.SegmentRuleClauseAddedEvent
- (*SegmentRuleClauseDeletedEvent)(nil), // 86: bucketeer.event.domain.SegmentRuleClauseDeletedEvent
- (*SegmentClauseAttributeChangedEvent)(nil), // 87: bucketeer.event.domain.SegmentClauseAttributeChangedEvent
- (*SegmentClauseOperatorChangedEvent)(nil), // 88: bucketeer.event.domain.SegmentClauseOperatorChangedEvent
- (*SegmentClauseValueAddedEvent)(nil), // 89: bucketeer.event.domain.SegmentClauseValueAddedEvent
- (*SegmentClauseValueRemovedEvent)(nil), // 90: bucketeer.event.domain.SegmentClauseValueRemovedEvent
- (*SegmentUserAddedEvent)(nil), // 91: bucketeer.event.domain.SegmentUserAddedEvent
- (*SegmentUserDeletedEvent)(nil), // 92: bucketeer.event.domain.SegmentUserDeletedEvent
- (*SegmentBulkUploadUsersEvent)(nil), // 93: bucketeer.event.domain.SegmentBulkUploadUsersEvent
- (*SegmentBulkUploadUsersStatusChangedEvent)(nil), // 94: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent
- (*EnvironmentCreatedEvent)(nil), // 95: bucketeer.event.domain.EnvironmentCreatedEvent
- (*EnvironmentRenamedEvent)(nil), // 96: bucketeer.event.domain.EnvironmentRenamedEvent
- (*EnvironmentDescriptionChangedEvent)(nil), // 97: bucketeer.event.domain.EnvironmentDescriptionChangedEvent
- (*EnvironmentDeletedEvent)(nil), // 98: bucketeer.event.domain.EnvironmentDeletedEvent
- (*EnvironmentV2CreatedEvent)(nil), // 99: bucketeer.event.domain.EnvironmentV2CreatedEvent
- (*EnvironmentV2RenamedEvent)(nil), // 100: bucketeer.event.domain.EnvironmentV2RenamedEvent
- (*EnvironmentV2DescriptionChangedEvent)(nil), // 101: bucketeer.event.domain.EnvironmentV2DescriptionChangedEvent
- (*EnvironmentV2RequireCommentChangedEvent)(nil), // 102: bucketeer.event.domain.EnvironmentV2RequireCommentChangedEvent
- (*EnvironmentV2ArchivedEvent)(nil), // 103: bucketeer.event.domain.EnvironmentV2ArchivedEvent
- (*EnvironmentV2UnarchivedEvent)(nil), // 104: bucketeer.event.domain.EnvironmentV2UnarchivedEvent
- (*AutoOpsRuleCreatedEvent)(nil), // 105: bucketeer.event.domain.AutoOpsRuleCreatedEvent
- (*AutoOpsRuleStoppedEvent)(nil), // 106: bucketeer.event.domain.AutoOpsRuleStoppedEvent
- (*AutoOpsRuleDeletedEvent)(nil), // 107: bucketeer.event.domain.AutoOpsRuleDeletedEvent
- (*AutoOpsRuleOpsTypeChangedEvent)(nil), // 108: bucketeer.event.domain.AutoOpsRuleOpsTypeChangedEvent
- (*AutoOpsRuleTriggeredAtChangedEvent)(nil), // 109: bucketeer.event.domain.AutoOpsRuleTriggeredAtChangedEvent
- (*AutoOpsRuleOpsStatusChangedEvent)(nil), // 110: bucketeer.event.domain.AutoOpsRuleOpsStatusChangedEvent
- (*OpsEventRateClauseAddedEvent)(nil), // 111: bucketeer.event.domain.OpsEventRateClauseAddedEvent
- (*OpsEventRateClauseChangedEvent)(nil), // 112: bucketeer.event.domain.OpsEventRateClauseChangedEvent
- (*AutoOpsRuleClauseDeletedEvent)(nil), // 113: bucketeer.event.domain.AutoOpsRuleClauseDeletedEvent
- (*DatetimeClauseAddedEvent)(nil), // 114: bucketeer.event.domain.DatetimeClauseAddedEvent
- (*DatetimeClauseChangedEvent)(nil), // 115: bucketeer.event.domain.DatetimeClauseChangedEvent
- (*PushCreatedEvent)(nil), // 116: bucketeer.event.domain.PushCreatedEvent
- (*PushDeletedEvent)(nil), // 117: bucketeer.event.domain.PushDeletedEvent
- (*PushTagsAddedEvent)(nil), // 118: bucketeer.event.domain.PushTagsAddedEvent
- (*PushTagsDeletedEvent)(nil), // 119: bucketeer.event.domain.PushTagsDeletedEvent
- (*PushRenamedEvent)(nil), // 120: bucketeer.event.domain.PushRenamedEvent
- (*PushTagsUpdatedEvent)(nil), // 121: bucketeer.event.domain.PushTagsUpdatedEvent
- (*PushUpdatedEvent)(nil), // 122: bucketeer.event.domain.PushUpdatedEvent
- (*SubscriptionCreatedEvent)(nil), // 123: bucketeer.event.domain.SubscriptionCreatedEvent
- (*SubscriptionDeletedEvent)(nil), // 124: bucketeer.event.domain.SubscriptionDeletedEvent
- (*SubscriptionEnabledEvent)(nil), // 125: bucketeer.event.domain.SubscriptionEnabledEvent
- (*SubscriptionDisabledEvent)(nil), // 126: bucketeer.event.domain.SubscriptionDisabledEvent
- (*SubscriptionSourceTypesAddedEvent)(nil), // 127: bucketeer.event.domain.SubscriptionSourceTypesAddedEvent
- (*SubscriptionSourceTypesDeletedEvent)(nil), // 128: bucketeer.event.domain.SubscriptionSourceTypesDeletedEvent
- (*SubscriptionRenamedEvent)(nil), // 129: bucketeer.event.domain.SubscriptionRenamedEvent
- (*SubscriptionUpdatedEvent)(nil), // 130: bucketeer.event.domain.SubscriptionUpdatedEvent
- (*AdminSubscriptionCreatedEvent)(nil), // 131: bucketeer.event.domain.AdminSubscriptionCreatedEvent
- (*AdminSubscriptionDeletedEvent)(nil), // 132: bucketeer.event.domain.AdminSubscriptionDeletedEvent
- (*AdminSubscriptionEnabledEvent)(nil), // 133: bucketeer.event.domain.AdminSubscriptionEnabledEvent
- (*AdminSubscriptionDisabledEvent)(nil), // 134: bucketeer.event.domain.AdminSubscriptionDisabledEvent
- (*AdminSubscriptionSourceTypesAddedEvent)(nil), // 135: bucketeer.event.domain.AdminSubscriptionSourceTypesAddedEvent
- (*AdminSubscriptionSourceTypesDeletedEvent)(nil), // 136: bucketeer.event.domain.AdminSubscriptionSourceTypesDeletedEvent
- (*AdminSubscriptionRenamedEvent)(nil), // 137: bucketeer.event.domain.AdminSubscriptionRenamedEvent
- (*ProjectCreatedEvent)(nil), // 138: bucketeer.event.domain.ProjectCreatedEvent
- (*ProjectDescriptionChangedEvent)(nil), // 139: bucketeer.event.domain.ProjectDescriptionChangedEvent
- (*ProjectRenamedEvent)(nil), // 140: bucketeer.event.domain.ProjectRenamedEvent
- (*ProjectEnabledEvent)(nil), // 141: bucketeer.event.domain.ProjectEnabledEvent
- (*ProjectDisabledEvent)(nil), // 142: bucketeer.event.domain.ProjectDisabledEvent
- (*ProjectTrialCreatedEvent)(nil), // 143: bucketeer.event.domain.ProjectTrialCreatedEvent
- (*ProjectTrialConvertedEvent)(nil), // 144: bucketeer.event.domain.ProjectTrialConvertedEvent
- (*PrerequisiteAddedEvent)(nil), // 145: bucketeer.event.domain.PrerequisiteAddedEvent
- (*PrerequisiteVariationChangedEvent)(nil), // 146: bucketeer.event.domain.PrerequisiteVariationChangedEvent
- (*PrerequisiteRemovedEvent)(nil), // 147: bucketeer.event.domain.PrerequisiteRemovedEvent
- (*ProgressiveRolloutCreatedEvent)(nil), // 148: bucketeer.event.domain.ProgressiveRolloutCreatedEvent
- (*ProgressiveRolloutStoppedEvent)(nil), // 149: bucketeer.event.domain.ProgressiveRolloutStoppedEvent
- (*ProgressiveRolloutDeletedEvent)(nil), // 150: bucketeer.event.domain.ProgressiveRolloutDeletedEvent
- (*ProgressiveRolloutScheduleTriggeredAtChangedEvent)(nil), // 151: bucketeer.event.domain.ProgressiveRolloutScheduleTriggeredAtChangedEvent
- (*OrganizationCreatedEvent)(nil), // 152: bucketeer.event.domain.OrganizationCreatedEvent
- (*OrganizationDescriptionChangedEvent)(nil), // 153: bucketeer.event.domain.OrganizationDescriptionChangedEvent
- (*OrganizationOwnerEmailChangedEvent)(nil), // 154: bucketeer.event.domain.OrganizationOwnerEmailChangedEvent
- (*OrganizationNameChangedEvent)(nil), // 155: bucketeer.event.domain.OrganizationNameChangedEvent
- (*OrganizationEnabledEvent)(nil), // 156: bucketeer.event.domain.OrganizationEnabledEvent
- (*OrganizationDisabledEvent)(nil), // 157: bucketeer.event.domain.OrganizationDisabledEvent
- (*OrganizationArchivedEvent)(nil), // 158: bucketeer.event.domain.OrganizationArchivedEvent
- (*OrganizationUnarchivedEvent)(nil), // 159: bucketeer.event.domain.OrganizationUnarchivedEvent
- (*OrganizationTrialConvertedEvent)(nil), // 160: bucketeer.event.domain.OrganizationTrialConvertedEvent
- (*FlagTriggerCreatedEvent)(nil), // 161: bucketeer.event.domain.FlagTriggerCreatedEvent
- (*FlagTriggerResetEvent)(nil), // 162: bucketeer.event.domain.FlagTriggerResetEvent
- (*FlagTriggerDescriptionChangedEvent)(nil), // 163: bucketeer.event.domain.FlagTriggerDescriptionChangedEvent
- (*FlagTriggerDisabledEvent)(nil), // 164: bucketeer.event.domain.FlagTriggerDisabledEvent
- (*FlagTriggerEnabledEvent)(nil), // 165: bucketeer.event.domain.FlagTriggerEnabledEvent
- (*FlagTriggerDeletedEvent)(nil), // 166: bucketeer.event.domain.FlagTriggerDeletedEvent
- (*FlagTriggerUsageUpdatedEvent)(nil), // 167: bucketeer.event.domain.FlagTriggerUsageUpdatedEvent
- (*AccountV2FirstNameChangedEvent)(nil), // 168: bucketeer.event.domain.AccountV2FirstNameChangedEvent
- (*AccountV2LastNameChangedEvent)(nil), // 169: bucketeer.event.domain.AccountV2LastNameChangedEvent
- (*AccountV2LanguageChangedEvent)(nil), // 170: bucketeer.event.domain.AccountV2LanguageChangedEvent
- (*TagCreatedEvent)(nil), // 171: bucketeer.event.domain.TagCreatedEvent
- (*TagDeletedEvent)(nil), // 172: bucketeer.event.domain.TagDeletedEvent
- (*Editor_PublicAPIEditor)(nil), // 173: bucketeer.event.domain.Editor.PublicAPIEditor
- (*anypb.Any)(nil), // 174: google.protobuf.Any
- (*feature.Variation)(nil), // 175: bucketeer.feature.Variation
- (*wrapperspb.Int32Value)(nil), // 176: google.protobuf.Int32Value
- (feature.Feature_VariationType)(0), // 177: bucketeer.feature.Feature.VariationType
- (*feature.Prerequisite)(nil), // 178: bucketeer.feature.Prerequisite
- (*feature.Rule)(nil), // 179: bucketeer.feature.Rule
- (*feature.Target)(nil), // 180: bucketeer.feature.Target
- (*feature.Strategy)(nil), // 181: bucketeer.feature.Strategy
- (*feature.FixedStrategy)(nil), // 182: bucketeer.feature.FixedStrategy
- (*feature.RolloutStrategy)(nil), // 183: bucketeer.feature.RolloutStrategy
- (*feature.Clause)(nil), // 184: bucketeer.feature.Clause
- (feature.Clause_Operator)(0), // 185: bucketeer.feature.Clause.Operator
- (account.AccountV2_Role_Organization)(0), // 186: bucketeer.account.AccountV2.Role.Organization
- (*account.AccountV2_EnvironmentRole)(nil), // 187: bucketeer.account.AccountV2.EnvironmentRole
- (account.FilterTargetType)(0), // 188: bucketeer.account.FilterTargetType
- (account.APIKey_Role)(0), // 189: bucketeer.account.APIKey.Role
- (*wrapperspb.StringValue)(nil), // 190: google.protobuf.StringValue
- (feature.SegmentUser_State)(0), // 191: bucketeer.feature.SegmentUser.State
- (feature.Segment_Status)(0), // 192: bucketeer.feature.Segment.Status
- (autoops.OpsType)(0), // 193: bucketeer.autoops.OpsType
- (*autoops.Clause)(nil), // 194: bucketeer.autoops.Clause
- (autoops.AutoOpsStatus)(0), // 195: bucketeer.autoops.AutoOpsStatus
- (*autoops.OpsEventRateClause)(nil), // 196: bucketeer.autoops.OpsEventRateClause
- (*autoops.DatetimeClause)(nil), // 197: bucketeer.autoops.DatetimeClause
- (notification.Subscription_SourceType)(0), // 198: bucketeer.notification.Subscription.SourceType
- (*notification.Recipient)(nil), // 199: bucketeer.notification.Recipient
- (*wrapperspb.BoolValue)(nil), // 200: google.protobuf.BoolValue
- (autoops.ProgressiveRollout_Type)(0), // 201: bucketeer.autoops.ProgressiveRollout.Type
- (autoops.ProgressiveRollout_Status)(0), // 202: bucketeer.autoops.ProgressiveRollout.Status
- (autoops.ProgressiveRollout_StoppedBy)(0), // 203: bucketeer.autoops.ProgressiveRollout.StoppedBy
- (feature.FlagTrigger_Type)(0), // 204: bucketeer.feature.FlagTrigger.Type
- (feature.FlagTrigger_Action)(0), // 205: bucketeer.feature.FlagTrigger.Action
- (tag.Tag_EntityType)(0), // 206: bucketeer.tag.Tag.EntityType
+ (*GoalUpdatedEvent)(nil), // 43: bucketeer.event.domain.GoalUpdatedEvent
+ (*GoalRenamedEvent)(nil), // 44: bucketeer.event.domain.GoalRenamedEvent
+ (*GoalDescriptionChangedEvent)(nil), // 45: bucketeer.event.domain.GoalDescriptionChangedEvent
+ (*GoalArchivedEvent)(nil), // 46: bucketeer.event.domain.GoalArchivedEvent
+ (*GoalDeletedEvent)(nil), // 47: bucketeer.event.domain.GoalDeletedEvent
+ (*ExperimentCreatedEvent)(nil), // 48: bucketeer.event.domain.ExperimentCreatedEvent
+ (*ExperimentStoppedEvent)(nil), // 49: bucketeer.event.domain.ExperimentStoppedEvent
+ (*ExperimentArchivedEvent)(nil), // 50: bucketeer.event.domain.ExperimentArchivedEvent
+ (*ExperimentDeletedEvent)(nil), // 51: bucketeer.event.domain.ExperimentDeletedEvent
+ (*ExperimentStartAtChangedEvent)(nil), // 52: bucketeer.event.domain.ExperimentStartAtChangedEvent
+ (*ExperimentStopAtChangedEvent)(nil), // 53: bucketeer.event.domain.ExperimentStopAtChangedEvent
+ (*ExperimentPeriodChangedEvent)(nil), // 54: bucketeer.event.domain.ExperimentPeriodChangedEvent
+ (*ExperimentNameChangedEvent)(nil), // 55: bucketeer.event.domain.ExperimentNameChangedEvent
+ (*ExperimentDescriptionChangedEvent)(nil), // 56: bucketeer.event.domain.ExperimentDescriptionChangedEvent
+ (*ExperimentStartedEvent)(nil), // 57: bucketeer.event.domain.ExperimentStartedEvent
+ (*ExperimentFinishedEvent)(nil), // 58: bucketeer.event.domain.ExperimentFinishedEvent
+ (*AccountV2CreatedEvent)(nil), // 59: bucketeer.event.domain.AccountV2CreatedEvent
+ (*AccountV2UpdatedEvent)(nil), // 60: bucketeer.event.domain.AccountV2UpdatedEvent
+ (*AccountV2NameChangedEvent)(nil), // 61: bucketeer.event.domain.AccountV2NameChangedEvent
+ (*AccountV2AvatarImageURLChangedEvent)(nil), // 62: bucketeer.event.domain.AccountV2AvatarImageURLChangedEvent
+ (*AccountV2TagsChangedEvent)(nil), // 63: bucketeer.event.domain.AccountV2TagsChangedEvent
+ (*AccountV2OrganizationRoleChangedEvent)(nil), // 64: bucketeer.event.domain.AccountV2OrganizationRoleChangedEvent
+ (*AccountV2EnvironmentRolesChangedEvent)(nil), // 65: bucketeer.event.domain.AccountV2EnvironmentRolesChangedEvent
+ (*AccountV2EnabledEvent)(nil), // 66: bucketeer.event.domain.AccountV2EnabledEvent
+ (*AccountV2DisabledEvent)(nil), // 67: bucketeer.event.domain.AccountV2DisabledEvent
+ (*AccountV2DeletedEvent)(nil), // 68: bucketeer.event.domain.AccountV2DeletedEvent
+ (*SearchFilterCreatedEvent)(nil), // 69: bucketeer.event.domain.SearchFilterCreatedEvent
+ (*SearchFilterNameChangedEvent)(nil), // 70: bucketeer.event.domain.SearchFilterNameChangedEvent
+ (*SearchFilterQueryChangedEvent)(nil), // 71: bucketeer.event.domain.SearchFilterQueryChangedEvent
+ (*SearchFilterDefaultChangedEvent)(nil), // 72: bucketeer.event.domain.SearchFilterDefaultChangedEvent
+ (*SearchFilterDeletedEvent)(nil), // 73: bucketeer.event.domain.SearchFilterDeletedEvent
+ (*APIKeyCreatedEvent)(nil), // 74: bucketeer.event.domain.APIKeyCreatedEvent
+ (*APIKeyChangedEvent)(nil), // 75: bucketeer.event.domain.APIKeyChangedEvent
+ (*APIKeyNameChangedEvent)(nil), // 76: bucketeer.event.domain.APIKeyNameChangedEvent
+ (*APIKeyEnabledEvent)(nil), // 77: bucketeer.event.domain.APIKeyEnabledEvent
+ (*APIKeyDisabledEvent)(nil), // 78: bucketeer.event.domain.APIKeyDisabledEvent
+ (*SegmentCreatedEvent)(nil), // 79: bucketeer.event.domain.SegmentCreatedEvent
+ (*SegmentDeletedEvent)(nil), // 80: bucketeer.event.domain.SegmentDeletedEvent
+ (*SegmentUpdatedEvent)(nil), // 81: bucketeer.event.domain.SegmentUpdatedEvent
+ (*SegmentNameChangedEvent)(nil), // 82: bucketeer.event.domain.SegmentNameChangedEvent
+ (*SegmentDescriptionChangedEvent)(nil), // 83: bucketeer.event.domain.SegmentDescriptionChangedEvent
+ (*SegmentRuleAddedEvent)(nil), // 84: bucketeer.event.domain.SegmentRuleAddedEvent
+ (*SegmentRuleDeletedEvent)(nil), // 85: bucketeer.event.domain.SegmentRuleDeletedEvent
+ (*SegmentRuleClauseAddedEvent)(nil), // 86: bucketeer.event.domain.SegmentRuleClauseAddedEvent
+ (*SegmentRuleClauseDeletedEvent)(nil), // 87: bucketeer.event.domain.SegmentRuleClauseDeletedEvent
+ (*SegmentClauseAttributeChangedEvent)(nil), // 88: bucketeer.event.domain.SegmentClauseAttributeChangedEvent
+ (*SegmentClauseOperatorChangedEvent)(nil), // 89: bucketeer.event.domain.SegmentClauseOperatorChangedEvent
+ (*SegmentClauseValueAddedEvent)(nil), // 90: bucketeer.event.domain.SegmentClauseValueAddedEvent
+ (*SegmentClauseValueRemovedEvent)(nil), // 91: bucketeer.event.domain.SegmentClauseValueRemovedEvent
+ (*SegmentUserAddedEvent)(nil), // 92: bucketeer.event.domain.SegmentUserAddedEvent
+ (*SegmentUserDeletedEvent)(nil), // 93: bucketeer.event.domain.SegmentUserDeletedEvent
+ (*SegmentBulkUploadUsersEvent)(nil), // 94: bucketeer.event.domain.SegmentBulkUploadUsersEvent
+ (*SegmentBulkUploadUsersStatusChangedEvent)(nil), // 95: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent
+ (*EnvironmentCreatedEvent)(nil), // 96: bucketeer.event.domain.EnvironmentCreatedEvent
+ (*EnvironmentRenamedEvent)(nil), // 97: bucketeer.event.domain.EnvironmentRenamedEvent
+ (*EnvironmentDescriptionChangedEvent)(nil), // 98: bucketeer.event.domain.EnvironmentDescriptionChangedEvent
+ (*EnvironmentDeletedEvent)(nil), // 99: bucketeer.event.domain.EnvironmentDeletedEvent
+ (*EnvironmentV2CreatedEvent)(nil), // 100: bucketeer.event.domain.EnvironmentV2CreatedEvent
+ (*EnvironmentV2RenamedEvent)(nil), // 101: bucketeer.event.domain.EnvironmentV2RenamedEvent
+ (*EnvironmentV2DescriptionChangedEvent)(nil), // 102: bucketeer.event.domain.EnvironmentV2DescriptionChangedEvent
+ (*EnvironmentV2RequireCommentChangedEvent)(nil), // 103: bucketeer.event.domain.EnvironmentV2RequireCommentChangedEvent
+ (*EnvironmentV2ArchivedEvent)(nil), // 104: bucketeer.event.domain.EnvironmentV2ArchivedEvent
+ (*EnvironmentV2UnarchivedEvent)(nil), // 105: bucketeer.event.domain.EnvironmentV2UnarchivedEvent
+ (*AutoOpsRuleCreatedEvent)(nil), // 106: bucketeer.event.domain.AutoOpsRuleCreatedEvent
+ (*AutoOpsRuleStoppedEvent)(nil), // 107: bucketeer.event.domain.AutoOpsRuleStoppedEvent
+ (*AutoOpsRuleDeletedEvent)(nil), // 108: bucketeer.event.domain.AutoOpsRuleDeletedEvent
+ (*AutoOpsRuleOpsTypeChangedEvent)(nil), // 109: bucketeer.event.domain.AutoOpsRuleOpsTypeChangedEvent
+ (*AutoOpsRuleTriggeredAtChangedEvent)(nil), // 110: bucketeer.event.domain.AutoOpsRuleTriggeredAtChangedEvent
+ (*AutoOpsRuleOpsStatusChangedEvent)(nil), // 111: bucketeer.event.domain.AutoOpsRuleOpsStatusChangedEvent
+ (*OpsEventRateClauseAddedEvent)(nil), // 112: bucketeer.event.domain.OpsEventRateClauseAddedEvent
+ (*OpsEventRateClauseChangedEvent)(nil), // 113: bucketeer.event.domain.OpsEventRateClauseChangedEvent
+ (*AutoOpsRuleClauseDeletedEvent)(nil), // 114: bucketeer.event.domain.AutoOpsRuleClauseDeletedEvent
+ (*DatetimeClauseAddedEvent)(nil), // 115: bucketeer.event.domain.DatetimeClauseAddedEvent
+ (*DatetimeClauseChangedEvent)(nil), // 116: bucketeer.event.domain.DatetimeClauseChangedEvent
+ (*PushCreatedEvent)(nil), // 117: bucketeer.event.domain.PushCreatedEvent
+ (*PushDeletedEvent)(nil), // 118: bucketeer.event.domain.PushDeletedEvent
+ (*PushTagsAddedEvent)(nil), // 119: bucketeer.event.domain.PushTagsAddedEvent
+ (*PushTagsDeletedEvent)(nil), // 120: bucketeer.event.domain.PushTagsDeletedEvent
+ (*PushRenamedEvent)(nil), // 121: bucketeer.event.domain.PushRenamedEvent
+ (*PushTagsUpdatedEvent)(nil), // 122: bucketeer.event.domain.PushTagsUpdatedEvent
+ (*PushUpdatedEvent)(nil), // 123: bucketeer.event.domain.PushUpdatedEvent
+ (*SubscriptionCreatedEvent)(nil), // 124: bucketeer.event.domain.SubscriptionCreatedEvent
+ (*SubscriptionDeletedEvent)(nil), // 125: bucketeer.event.domain.SubscriptionDeletedEvent
+ (*SubscriptionEnabledEvent)(nil), // 126: bucketeer.event.domain.SubscriptionEnabledEvent
+ (*SubscriptionDisabledEvent)(nil), // 127: bucketeer.event.domain.SubscriptionDisabledEvent
+ (*SubscriptionSourceTypesAddedEvent)(nil), // 128: bucketeer.event.domain.SubscriptionSourceTypesAddedEvent
+ (*SubscriptionSourceTypesDeletedEvent)(nil), // 129: bucketeer.event.domain.SubscriptionSourceTypesDeletedEvent
+ (*SubscriptionRenamedEvent)(nil), // 130: bucketeer.event.domain.SubscriptionRenamedEvent
+ (*SubscriptionUpdatedEvent)(nil), // 131: bucketeer.event.domain.SubscriptionUpdatedEvent
+ (*AdminSubscriptionCreatedEvent)(nil), // 132: bucketeer.event.domain.AdminSubscriptionCreatedEvent
+ (*AdminSubscriptionDeletedEvent)(nil), // 133: bucketeer.event.domain.AdminSubscriptionDeletedEvent
+ (*AdminSubscriptionEnabledEvent)(nil), // 134: bucketeer.event.domain.AdminSubscriptionEnabledEvent
+ (*AdminSubscriptionDisabledEvent)(nil), // 135: bucketeer.event.domain.AdminSubscriptionDisabledEvent
+ (*AdminSubscriptionSourceTypesAddedEvent)(nil), // 136: bucketeer.event.domain.AdminSubscriptionSourceTypesAddedEvent
+ (*AdminSubscriptionSourceTypesDeletedEvent)(nil), // 137: bucketeer.event.domain.AdminSubscriptionSourceTypesDeletedEvent
+ (*AdminSubscriptionRenamedEvent)(nil), // 138: bucketeer.event.domain.AdminSubscriptionRenamedEvent
+ (*ProjectCreatedEvent)(nil), // 139: bucketeer.event.domain.ProjectCreatedEvent
+ (*ProjectDescriptionChangedEvent)(nil), // 140: bucketeer.event.domain.ProjectDescriptionChangedEvent
+ (*ProjectRenamedEvent)(nil), // 141: bucketeer.event.domain.ProjectRenamedEvent
+ (*ProjectEnabledEvent)(nil), // 142: bucketeer.event.domain.ProjectEnabledEvent
+ (*ProjectDisabledEvent)(nil), // 143: bucketeer.event.domain.ProjectDisabledEvent
+ (*ProjectTrialCreatedEvent)(nil), // 144: bucketeer.event.domain.ProjectTrialCreatedEvent
+ (*ProjectTrialConvertedEvent)(nil), // 145: bucketeer.event.domain.ProjectTrialConvertedEvent
+ (*PrerequisiteAddedEvent)(nil), // 146: bucketeer.event.domain.PrerequisiteAddedEvent
+ (*PrerequisiteVariationChangedEvent)(nil), // 147: bucketeer.event.domain.PrerequisiteVariationChangedEvent
+ (*PrerequisiteRemovedEvent)(nil), // 148: bucketeer.event.domain.PrerequisiteRemovedEvent
+ (*ProgressiveRolloutCreatedEvent)(nil), // 149: bucketeer.event.domain.ProgressiveRolloutCreatedEvent
+ (*ProgressiveRolloutStoppedEvent)(nil), // 150: bucketeer.event.domain.ProgressiveRolloutStoppedEvent
+ (*ProgressiveRolloutDeletedEvent)(nil), // 151: bucketeer.event.domain.ProgressiveRolloutDeletedEvent
+ (*ProgressiveRolloutScheduleTriggeredAtChangedEvent)(nil), // 152: bucketeer.event.domain.ProgressiveRolloutScheduleTriggeredAtChangedEvent
+ (*OrganizationCreatedEvent)(nil), // 153: bucketeer.event.domain.OrganizationCreatedEvent
+ (*OrganizationDescriptionChangedEvent)(nil), // 154: bucketeer.event.domain.OrganizationDescriptionChangedEvent
+ (*OrganizationOwnerEmailChangedEvent)(nil), // 155: bucketeer.event.domain.OrganizationOwnerEmailChangedEvent
+ (*OrganizationNameChangedEvent)(nil), // 156: bucketeer.event.domain.OrganizationNameChangedEvent
+ (*OrganizationEnabledEvent)(nil), // 157: bucketeer.event.domain.OrganizationEnabledEvent
+ (*OrganizationDisabledEvent)(nil), // 158: bucketeer.event.domain.OrganizationDisabledEvent
+ (*OrganizationArchivedEvent)(nil), // 159: bucketeer.event.domain.OrganizationArchivedEvent
+ (*OrganizationUnarchivedEvent)(nil), // 160: bucketeer.event.domain.OrganizationUnarchivedEvent
+ (*OrganizationTrialConvertedEvent)(nil), // 161: bucketeer.event.domain.OrganizationTrialConvertedEvent
+ (*FlagTriggerCreatedEvent)(nil), // 162: bucketeer.event.domain.FlagTriggerCreatedEvent
+ (*FlagTriggerResetEvent)(nil), // 163: bucketeer.event.domain.FlagTriggerResetEvent
+ (*FlagTriggerDescriptionChangedEvent)(nil), // 164: bucketeer.event.domain.FlagTriggerDescriptionChangedEvent
+ (*FlagTriggerDisabledEvent)(nil), // 165: bucketeer.event.domain.FlagTriggerDisabledEvent
+ (*FlagTriggerEnabledEvent)(nil), // 166: bucketeer.event.domain.FlagTriggerEnabledEvent
+ (*FlagTriggerDeletedEvent)(nil), // 167: bucketeer.event.domain.FlagTriggerDeletedEvent
+ (*FlagTriggerUsageUpdatedEvent)(nil), // 168: bucketeer.event.domain.FlagTriggerUsageUpdatedEvent
+ (*AccountV2FirstNameChangedEvent)(nil), // 169: bucketeer.event.domain.AccountV2FirstNameChangedEvent
+ (*AccountV2LastNameChangedEvent)(nil), // 170: bucketeer.event.domain.AccountV2LastNameChangedEvent
+ (*AccountV2LanguageChangedEvent)(nil), // 171: bucketeer.event.domain.AccountV2LanguageChangedEvent
+ (*TagCreatedEvent)(nil), // 172: bucketeer.event.domain.TagCreatedEvent
+ (*TagDeletedEvent)(nil), // 173: bucketeer.event.domain.TagDeletedEvent
+ (*CodeReferenceCreatedEvent)(nil), // 174: bucketeer.event.domain.CodeReferenceCreatedEvent
+ (*CodeReferenceUpdatedEvent)(nil), // 175: bucketeer.event.domain.CodeReferenceUpdatedEvent
+ (*CodeReferenceDeletedEvent)(nil), // 176: bucketeer.event.domain.CodeReferenceDeletedEvent
+ (*Editor_PublicAPIEditor)(nil), // 177: bucketeer.event.domain.Editor.PublicAPIEditor
+ (*anypb.Any)(nil), // 178: google.protobuf.Any
+ (*feature.Variation)(nil), // 179: bucketeer.feature.Variation
+ (*wrapperspb.Int32Value)(nil), // 180: google.protobuf.Int32Value
+ (feature.Feature_VariationType)(0), // 181: bucketeer.feature.Feature.VariationType
+ (*feature.Prerequisite)(nil), // 182: bucketeer.feature.Prerequisite
+ (*feature.Rule)(nil), // 183: bucketeer.feature.Rule
+ (*feature.Target)(nil), // 184: bucketeer.feature.Target
+ (*feature.Strategy)(nil), // 185: bucketeer.feature.Strategy
+ (*feature.FixedStrategy)(nil), // 186: bucketeer.feature.FixedStrategy
+ (*feature.RolloutStrategy)(nil), // 187: bucketeer.feature.RolloutStrategy
+ (*feature.Clause)(nil), // 188: bucketeer.feature.Clause
+ (feature.Clause_Operator)(0), // 189: bucketeer.feature.Clause.Operator
+ (experiment.Goal_ConnectionType)(0), // 190: bucketeer.experiment.Goal.ConnectionType
+ (*wrapperspb.StringValue)(nil), // 191: google.protobuf.StringValue
+ (account.AccountV2_Role_Organization)(0), // 192: bucketeer.account.AccountV2.Role.Organization
+ (*account.AccountV2_EnvironmentRole)(nil), // 193: bucketeer.account.AccountV2.EnvironmentRole
+ (account.FilterTargetType)(0), // 194: bucketeer.account.FilterTargetType
+ (account.APIKey_Role)(0), // 195: bucketeer.account.APIKey.Role
+ (feature.SegmentUser_State)(0), // 196: bucketeer.feature.SegmentUser.State
+ (feature.Segment_Status)(0), // 197: bucketeer.feature.Segment.Status
+ (autoops.OpsType)(0), // 198: bucketeer.autoops.OpsType
+ (*autoops.Clause)(nil), // 199: bucketeer.autoops.Clause
+ (autoops.AutoOpsStatus)(0), // 200: bucketeer.autoops.AutoOpsStatus
+ (*autoops.OpsEventRateClause)(nil), // 201: bucketeer.autoops.OpsEventRateClause
+ (*autoops.DatetimeClause)(nil), // 202: bucketeer.autoops.DatetimeClause
+ (notification.Subscription_SourceType)(0), // 203: bucketeer.notification.Subscription.SourceType
+ (*notification.Recipient)(nil), // 204: bucketeer.notification.Recipient
+ (*wrapperspb.BoolValue)(nil), // 205: google.protobuf.BoolValue
+ (autoops.ProgressiveRollout_Type)(0), // 206: bucketeer.autoops.ProgressiveRollout.Type
+ (autoops.ProgressiveRollout_Status)(0), // 207: bucketeer.autoops.ProgressiveRollout.Status
+ (autoops.ProgressiveRollout_StoppedBy)(0), // 208: bucketeer.autoops.ProgressiveRollout.StoppedBy
+ (feature.FlagTrigger_Type)(0), // 209: bucketeer.feature.FlagTrigger.Type
+ (feature.FlagTrigger_Action)(0), // 210: bucketeer.feature.FlagTrigger.Action
+ (tag.Tag_EntityType)(0), // 211: bucketeer.tag.Tag.EntityType
+ (coderef.CodeReference_RepositoryType)(0), // 212: bucketeer.coderef.CodeReference.RepositoryType
}
var file_proto_event_domain_event_proto_depIdxs = []int32{
0, // 0: bucketeer.event.domain.Event.entity_type:type_name -> bucketeer.event.domain.Event.EntityType
1, // 1: bucketeer.event.domain.Event.type:type_name -> bucketeer.event.domain.Event.Type
3, // 2: bucketeer.event.domain.Event.editor:type_name -> bucketeer.event.domain.Editor
- 174, // 3: bucketeer.event.domain.Event.data:type_name -> google.protobuf.Any
+ 178, // 3: bucketeer.event.domain.Event.data:type_name -> google.protobuf.Any
4, // 4: bucketeer.event.domain.Event.options:type_name -> bucketeer.event.domain.Options
- 173, // 5: bucketeer.event.domain.Editor.public_api_editor:type_name -> bucketeer.event.domain.Editor.PublicAPIEditor
- 175, // 6: bucketeer.event.domain.FeatureCreatedEvent.variations:type_name -> bucketeer.feature.Variation
- 176, // 7: bucketeer.event.domain.FeatureCreatedEvent.default_on_variation_index:type_name -> google.protobuf.Int32Value
- 176, // 8: bucketeer.event.domain.FeatureCreatedEvent.default_off_variation_index:type_name -> google.protobuf.Int32Value
- 177, // 9: bucketeer.event.domain.FeatureCreatedEvent.variation_type:type_name -> bucketeer.feature.Feature.VariationType
- 178, // 10: bucketeer.event.domain.FeatureCreatedEvent.prerequisites:type_name -> bucketeer.feature.Prerequisite
- 179, // 11: bucketeer.event.domain.FeatureCreatedEvent.rules:type_name -> bucketeer.feature.Rule
- 180, // 12: bucketeer.event.domain.FeatureCreatedEvent.targets:type_name -> bucketeer.feature.Target
- 175, // 13: bucketeer.event.domain.FeatureVariationAddedEvent.variation:type_name -> bucketeer.feature.Variation
- 179, // 14: bucketeer.event.domain.FeatureRuleAddedEvent.rule:type_name -> bucketeer.feature.Rule
- 181, // 15: bucketeer.event.domain.FeatureChangeRuleStrategyEvent.strategy:type_name -> bucketeer.feature.Strategy
- 182, // 16: bucketeer.event.domain.FeatureFixedStrategyChangedEvent.strategy:type_name -> bucketeer.feature.FixedStrategy
- 183, // 17: bucketeer.event.domain.FeatureRolloutStrategyChangedEvent.strategy:type_name -> bucketeer.feature.RolloutStrategy
- 184, // 18: bucketeer.event.domain.RuleClauseAddedEvent.clause:type_name -> bucketeer.feature.Clause
- 185, // 19: bucketeer.event.domain.ClauseOperatorChangedEvent.operator:type_name -> bucketeer.feature.Clause.Operator
- 181, // 20: bucketeer.event.domain.FeatureDefaultStrategyChangedEvent.strategy:type_name -> bucketeer.feature.Strategy
- 175, // 21: bucketeer.event.domain.FeatureClonedEvent.variations:type_name -> bucketeer.feature.Variation
- 180, // 22: bucketeer.event.domain.FeatureClonedEvent.targets:type_name -> bucketeer.feature.Target
- 179, // 23: bucketeer.event.domain.FeatureClonedEvent.rules:type_name -> bucketeer.feature.Rule
- 181, // 24: bucketeer.event.domain.FeatureClonedEvent.default_strategy:type_name -> bucketeer.feature.Strategy
- 177, // 25: bucketeer.event.domain.FeatureClonedEvent.variation_type:type_name -> bucketeer.feature.Feature.VariationType
- 178, // 26: bucketeer.event.domain.FeatureClonedEvent.prerequisites:type_name -> bucketeer.feature.Prerequisite
- 175, // 27: bucketeer.event.domain.ExperimentCreatedEvent.variations:type_name -> bucketeer.feature.Variation
- 186, // 28: bucketeer.event.domain.AccountV2CreatedEvent.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
- 187, // 29: bucketeer.event.domain.AccountV2CreatedEvent.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
- 186, // 30: bucketeer.event.domain.AccountV2OrganizationRoleChangedEvent.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
- 187, // 31: bucketeer.event.domain.AccountV2EnvironmentRolesChangedEvent.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
- 188, // 32: bucketeer.event.domain.SearchFilterCreatedEvent.TargetType:type_name -> bucketeer.account.FilterTargetType
- 189, // 33: bucketeer.event.domain.APIKeyCreatedEvent.role:type_name -> bucketeer.account.APIKey.Role
- 190, // 34: bucketeer.event.domain.SegmentUpdatedEvent.name:type_name -> google.protobuf.StringValue
- 190, // 35: bucketeer.event.domain.SegmentUpdatedEvent.description:type_name -> google.protobuf.StringValue
- 179, // 36: bucketeer.event.domain.SegmentRuleAddedEvent.rule:type_name -> bucketeer.feature.Rule
- 184, // 37: bucketeer.event.domain.SegmentRuleClauseAddedEvent.clause:type_name -> bucketeer.feature.Clause
- 185, // 38: bucketeer.event.domain.SegmentClauseOperatorChangedEvent.operator:type_name -> bucketeer.feature.Clause.Operator
- 191, // 39: bucketeer.event.domain.SegmentUserAddedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
- 191, // 40: bucketeer.event.domain.SegmentUserDeletedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
- 192, // 41: bucketeer.event.domain.SegmentBulkUploadUsersEvent.status:type_name -> bucketeer.feature.Segment.Status
- 191, // 42: bucketeer.event.domain.SegmentBulkUploadUsersEvent.state:type_name -> bucketeer.feature.SegmentUser.State
- 192, // 43: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent.status:type_name -> bucketeer.feature.Segment.Status
- 191, // 44: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
- 193, // 45: bucketeer.event.domain.AutoOpsRuleCreatedEvent.ops_type:type_name -> bucketeer.autoops.OpsType
- 194, // 46: bucketeer.event.domain.AutoOpsRuleCreatedEvent.clauses:type_name -> bucketeer.autoops.Clause
- 195, // 47: bucketeer.event.domain.AutoOpsRuleCreatedEvent.ops_status:type_name -> bucketeer.autoops.AutoOpsStatus
- 193, // 48: bucketeer.event.domain.AutoOpsRuleOpsTypeChangedEvent.ops_type:type_name -> bucketeer.autoops.OpsType
- 195, // 49: bucketeer.event.domain.AutoOpsRuleOpsStatusChangedEvent.ops_status:type_name -> bucketeer.autoops.AutoOpsStatus
- 196, // 50: bucketeer.event.domain.OpsEventRateClauseAddedEvent.ops_event_rate_clause:type_name -> bucketeer.autoops.OpsEventRateClause
- 196, // 51: bucketeer.event.domain.OpsEventRateClauseChangedEvent.ops_event_rate_clause:type_name -> bucketeer.autoops.OpsEventRateClause
- 197, // 52: bucketeer.event.domain.DatetimeClauseAddedEvent.datetime_clause:type_name -> bucketeer.autoops.DatetimeClause
- 197, // 53: bucketeer.event.domain.DatetimeClauseChangedEvent.datetime_clause:type_name -> bucketeer.autoops.DatetimeClause
- 190, // 54: bucketeer.event.domain.PushUpdatedEvent.name:type_name -> google.protobuf.StringValue
- 198, // 55: bucketeer.event.domain.SubscriptionCreatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 199, // 56: bucketeer.event.domain.SubscriptionCreatedEvent.recipient:type_name -> bucketeer.notification.Recipient
- 198, // 57: bucketeer.event.domain.SubscriptionSourceTypesAddedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 198, // 58: bucketeer.event.domain.SubscriptionSourceTypesDeletedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 190, // 59: bucketeer.event.domain.SubscriptionUpdatedEvent.name:type_name -> google.protobuf.StringValue
- 198, // 60: bucketeer.event.domain.SubscriptionUpdatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 200, // 61: bucketeer.event.domain.SubscriptionUpdatedEvent.disabled:type_name -> google.protobuf.BoolValue
- 198, // 62: bucketeer.event.domain.AdminSubscriptionCreatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 199, // 63: bucketeer.event.domain.AdminSubscriptionCreatedEvent.recipient:type_name -> bucketeer.notification.Recipient
- 198, // 64: bucketeer.event.domain.AdminSubscriptionSourceTypesAddedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 198, // 65: bucketeer.event.domain.AdminSubscriptionSourceTypesDeletedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
- 178, // 66: bucketeer.event.domain.PrerequisiteAddedEvent.prerequisite:type_name -> bucketeer.feature.Prerequisite
- 178, // 67: bucketeer.event.domain.PrerequisiteVariationChangedEvent.prerequisite:type_name -> bucketeer.feature.Prerequisite
- 174, // 68: bucketeer.event.domain.ProgressiveRolloutCreatedEvent.clause:type_name -> google.protobuf.Any
- 201, // 69: bucketeer.event.domain.ProgressiveRolloutCreatedEvent.type:type_name -> bucketeer.autoops.ProgressiveRollout.Type
- 202, // 70: bucketeer.event.domain.ProgressiveRolloutStoppedEvent.status:type_name -> bucketeer.autoops.ProgressiveRollout.Status
- 203, // 71: bucketeer.event.domain.ProgressiveRolloutStoppedEvent.stopped_by:type_name -> bucketeer.autoops.ProgressiveRollout.StoppedBy
- 204, // 72: bucketeer.event.domain.FlagTriggerCreatedEvent.type:type_name -> bucketeer.feature.FlagTrigger.Type
- 205, // 73: bucketeer.event.domain.FlagTriggerCreatedEvent.action:type_name -> bucketeer.feature.FlagTrigger.Action
- 206, // 74: bucketeer.event.domain.TagCreatedEvent.entity_type:type_name -> bucketeer.tag.Tag.EntityType
- 75, // [75:75] is the sub-list for method output_type
- 75, // [75:75] is the sub-list for method input_type
- 75, // [75:75] is the sub-list for extension type_name
- 75, // [75:75] is the sub-list for extension extendee
- 0, // [0:75] is the sub-list for field type_name
+ 177, // 5: bucketeer.event.domain.Editor.public_api_editor:type_name -> bucketeer.event.domain.Editor.PublicAPIEditor
+ 179, // 6: bucketeer.event.domain.FeatureCreatedEvent.variations:type_name -> bucketeer.feature.Variation
+ 180, // 7: bucketeer.event.domain.FeatureCreatedEvent.default_on_variation_index:type_name -> google.protobuf.Int32Value
+ 180, // 8: bucketeer.event.domain.FeatureCreatedEvent.default_off_variation_index:type_name -> google.protobuf.Int32Value
+ 181, // 9: bucketeer.event.domain.FeatureCreatedEvent.variation_type:type_name -> bucketeer.feature.Feature.VariationType
+ 182, // 10: bucketeer.event.domain.FeatureCreatedEvent.prerequisites:type_name -> bucketeer.feature.Prerequisite
+ 183, // 11: bucketeer.event.domain.FeatureCreatedEvent.rules:type_name -> bucketeer.feature.Rule
+ 184, // 12: bucketeer.event.domain.FeatureCreatedEvent.targets:type_name -> bucketeer.feature.Target
+ 179, // 13: bucketeer.event.domain.FeatureVariationAddedEvent.variation:type_name -> bucketeer.feature.Variation
+ 183, // 14: bucketeer.event.domain.FeatureRuleAddedEvent.rule:type_name -> bucketeer.feature.Rule
+ 185, // 15: bucketeer.event.domain.FeatureChangeRuleStrategyEvent.strategy:type_name -> bucketeer.feature.Strategy
+ 186, // 16: bucketeer.event.domain.FeatureFixedStrategyChangedEvent.strategy:type_name -> bucketeer.feature.FixedStrategy
+ 187, // 17: bucketeer.event.domain.FeatureRolloutStrategyChangedEvent.strategy:type_name -> bucketeer.feature.RolloutStrategy
+ 188, // 18: bucketeer.event.domain.RuleClauseAddedEvent.clause:type_name -> bucketeer.feature.Clause
+ 189, // 19: bucketeer.event.domain.ClauseOperatorChangedEvent.operator:type_name -> bucketeer.feature.Clause.Operator
+ 185, // 20: bucketeer.event.domain.FeatureDefaultStrategyChangedEvent.strategy:type_name -> bucketeer.feature.Strategy
+ 179, // 21: bucketeer.event.domain.FeatureClonedEvent.variations:type_name -> bucketeer.feature.Variation
+ 184, // 22: bucketeer.event.domain.FeatureClonedEvent.targets:type_name -> bucketeer.feature.Target
+ 183, // 23: bucketeer.event.domain.FeatureClonedEvent.rules:type_name -> bucketeer.feature.Rule
+ 185, // 24: bucketeer.event.domain.FeatureClonedEvent.default_strategy:type_name -> bucketeer.feature.Strategy
+ 181, // 25: bucketeer.event.domain.FeatureClonedEvent.variation_type:type_name -> bucketeer.feature.Feature.VariationType
+ 182, // 26: bucketeer.event.domain.FeatureClonedEvent.prerequisites:type_name -> bucketeer.feature.Prerequisite
+ 190, // 27: bucketeer.event.domain.GoalCreatedEvent.connection_type:type_name -> bucketeer.experiment.Goal.ConnectionType
+ 191, // 28: bucketeer.event.domain.GoalUpdatedEvent.name:type_name -> google.protobuf.StringValue
+ 191, // 29: bucketeer.event.domain.GoalUpdatedEvent.description:type_name -> google.protobuf.StringValue
+ 179, // 30: bucketeer.event.domain.ExperimentCreatedEvent.variations:type_name -> bucketeer.feature.Variation
+ 192, // 31: bucketeer.event.domain.AccountV2CreatedEvent.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
+ 193, // 32: bucketeer.event.domain.AccountV2CreatedEvent.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
+ 192, // 33: bucketeer.event.domain.AccountV2OrganizationRoleChangedEvent.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
+ 193, // 34: bucketeer.event.domain.AccountV2EnvironmentRolesChangedEvent.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
+ 194, // 35: bucketeer.event.domain.SearchFilterCreatedEvent.TargetType:type_name -> bucketeer.account.FilterTargetType
+ 195, // 36: bucketeer.event.domain.APIKeyCreatedEvent.role:type_name -> bucketeer.account.APIKey.Role
+ 191, // 37: bucketeer.event.domain.SegmentUpdatedEvent.name:type_name -> google.protobuf.StringValue
+ 191, // 38: bucketeer.event.domain.SegmentUpdatedEvent.description:type_name -> google.protobuf.StringValue
+ 183, // 39: bucketeer.event.domain.SegmentRuleAddedEvent.rule:type_name -> bucketeer.feature.Rule
+ 188, // 40: bucketeer.event.domain.SegmentRuleClauseAddedEvent.clause:type_name -> bucketeer.feature.Clause
+ 189, // 41: bucketeer.event.domain.SegmentClauseOperatorChangedEvent.operator:type_name -> bucketeer.feature.Clause.Operator
+ 196, // 42: bucketeer.event.domain.SegmentUserAddedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
+ 196, // 43: bucketeer.event.domain.SegmentUserDeletedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
+ 197, // 44: bucketeer.event.domain.SegmentBulkUploadUsersEvent.status:type_name -> bucketeer.feature.Segment.Status
+ 196, // 45: bucketeer.event.domain.SegmentBulkUploadUsersEvent.state:type_name -> bucketeer.feature.SegmentUser.State
+ 197, // 46: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent.status:type_name -> bucketeer.feature.Segment.Status
+ 196, // 47: bucketeer.event.domain.SegmentBulkUploadUsersStatusChangedEvent.state:type_name -> bucketeer.feature.SegmentUser.State
+ 198, // 48: bucketeer.event.domain.AutoOpsRuleCreatedEvent.ops_type:type_name -> bucketeer.autoops.OpsType
+ 199, // 49: bucketeer.event.domain.AutoOpsRuleCreatedEvent.clauses:type_name -> bucketeer.autoops.Clause
+ 200, // 50: bucketeer.event.domain.AutoOpsRuleCreatedEvent.ops_status:type_name -> bucketeer.autoops.AutoOpsStatus
+ 198, // 51: bucketeer.event.domain.AutoOpsRuleOpsTypeChangedEvent.ops_type:type_name -> bucketeer.autoops.OpsType
+ 200, // 52: bucketeer.event.domain.AutoOpsRuleOpsStatusChangedEvent.ops_status:type_name -> bucketeer.autoops.AutoOpsStatus
+ 201, // 53: bucketeer.event.domain.OpsEventRateClauseAddedEvent.ops_event_rate_clause:type_name -> bucketeer.autoops.OpsEventRateClause
+ 201, // 54: bucketeer.event.domain.OpsEventRateClauseChangedEvent.ops_event_rate_clause:type_name -> bucketeer.autoops.OpsEventRateClause
+ 202, // 55: bucketeer.event.domain.DatetimeClauseAddedEvent.datetime_clause:type_name -> bucketeer.autoops.DatetimeClause
+ 202, // 56: bucketeer.event.domain.DatetimeClauseChangedEvent.datetime_clause:type_name -> bucketeer.autoops.DatetimeClause
+ 191, // 57: bucketeer.event.domain.PushUpdatedEvent.name:type_name -> google.protobuf.StringValue
+ 203, // 58: bucketeer.event.domain.SubscriptionCreatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 204, // 59: bucketeer.event.domain.SubscriptionCreatedEvent.recipient:type_name -> bucketeer.notification.Recipient
+ 203, // 60: bucketeer.event.domain.SubscriptionSourceTypesAddedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 203, // 61: bucketeer.event.domain.SubscriptionSourceTypesDeletedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 191, // 62: bucketeer.event.domain.SubscriptionUpdatedEvent.name:type_name -> google.protobuf.StringValue
+ 203, // 63: bucketeer.event.domain.SubscriptionUpdatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 205, // 64: bucketeer.event.domain.SubscriptionUpdatedEvent.disabled:type_name -> google.protobuf.BoolValue
+ 203, // 65: bucketeer.event.domain.AdminSubscriptionCreatedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 204, // 66: bucketeer.event.domain.AdminSubscriptionCreatedEvent.recipient:type_name -> bucketeer.notification.Recipient
+ 203, // 67: bucketeer.event.domain.AdminSubscriptionSourceTypesAddedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 203, // 68: bucketeer.event.domain.AdminSubscriptionSourceTypesDeletedEvent.source_types:type_name -> bucketeer.notification.Subscription.SourceType
+ 182, // 69: bucketeer.event.domain.PrerequisiteAddedEvent.prerequisite:type_name -> bucketeer.feature.Prerequisite
+ 182, // 70: bucketeer.event.domain.PrerequisiteVariationChangedEvent.prerequisite:type_name -> bucketeer.feature.Prerequisite
+ 178, // 71: bucketeer.event.domain.ProgressiveRolloutCreatedEvent.clause:type_name -> google.protobuf.Any
+ 206, // 72: bucketeer.event.domain.ProgressiveRolloutCreatedEvent.type:type_name -> bucketeer.autoops.ProgressiveRollout.Type
+ 207, // 73: bucketeer.event.domain.ProgressiveRolloutStoppedEvent.status:type_name -> bucketeer.autoops.ProgressiveRollout.Status
+ 208, // 74: bucketeer.event.domain.ProgressiveRolloutStoppedEvent.stopped_by:type_name -> bucketeer.autoops.ProgressiveRollout.StoppedBy
+ 209, // 75: bucketeer.event.domain.FlagTriggerCreatedEvent.type:type_name -> bucketeer.feature.FlagTrigger.Type
+ 210, // 76: bucketeer.event.domain.FlagTriggerCreatedEvent.action:type_name -> bucketeer.feature.FlagTrigger.Action
+ 211, // 77: bucketeer.event.domain.TagCreatedEvent.entity_type:type_name -> bucketeer.tag.Tag.EntityType
+ 212, // 78: bucketeer.event.domain.CodeReferenceCreatedEvent.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 79, // [79:79] is the sub-list for method output_type
+ 79, // [79:79] is the sub-list for method input_type
+ 79, // [79:79] is the sub-list for extension type_name
+ 79, // [79:79] is the sub-list for extension extendee
+ 0, // [0:79] is the sub-list for field type_name
}
func init() { file_proto_event_domain_event_proto_init() }
@@ -13537,7 +14058,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GoalRenamedEvent); i {
+ switch v := v.(*GoalUpdatedEvent); i {
case 0:
return &v.state
case 1:
@@ -13549,7 +14070,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GoalDescriptionChangedEvent); i {
+ switch v := v.(*GoalRenamedEvent); i {
case 0:
return &v.state
case 1:
@@ -13561,7 +14082,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GoalArchivedEvent); i {
+ switch v := v.(*GoalDescriptionChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13573,7 +14094,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GoalDeletedEvent); i {
+ switch v := v.(*GoalArchivedEvent); i {
case 0:
return &v.state
case 1:
@@ -13585,7 +14106,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentCreatedEvent); i {
+ switch v := v.(*GoalDeletedEvent); i {
case 0:
return &v.state
case 1:
@@ -13597,7 +14118,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentStoppedEvent); i {
+ switch v := v.(*ExperimentCreatedEvent); i {
case 0:
return &v.state
case 1:
@@ -13609,7 +14130,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentArchivedEvent); i {
+ switch v := v.(*ExperimentStoppedEvent); i {
case 0:
return &v.state
case 1:
@@ -13621,7 +14142,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentDeletedEvent); i {
+ switch v := v.(*ExperimentArchivedEvent); i {
case 0:
return &v.state
case 1:
@@ -13633,7 +14154,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentStartAtChangedEvent); i {
+ switch v := v.(*ExperimentDeletedEvent); i {
case 0:
return &v.state
case 1:
@@ -13645,7 +14166,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentStopAtChangedEvent); i {
+ switch v := v.(*ExperimentStartAtChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13657,7 +14178,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentPeriodChangedEvent); i {
+ switch v := v.(*ExperimentStopAtChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13669,7 +14190,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentNameChangedEvent); i {
+ switch v := v.(*ExperimentPeriodChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13681,7 +14202,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentDescriptionChangedEvent); i {
+ switch v := v.(*ExperimentNameChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13693,7 +14214,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentStartedEvent); i {
+ switch v := v.(*ExperimentDescriptionChangedEvent); i {
case 0:
return &v.state
case 1:
@@ -13705,7 +14226,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ExperimentFinishedEvent); i {
+ switch v := v.(*ExperimentStartedEvent); i {
case 0:
return &v.state
case 1:
@@ -13717,7 +14238,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*AccountV2CreatedEvent); i {
+ switch v := v.(*ExperimentFinishedEvent); i {
case 0:
return &v.state
case 1:
@@ -13729,7 +14250,7 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*AccountV2UpdatedEvent); i {
+ switch v := v.(*AccountV2CreatedEvent); i {
case 0:
return &v.state
case 1:
@@ -13741,6 +14262,18 @@ func file_proto_event_domain_event_proto_init() {
}
}
file_proto_event_domain_event_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*AccountV2UpdatedEvent); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_event_domain_event_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2NameChangedEvent); i {
case 0:
return &v.state
@@ -13752,7 +14285,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2AvatarImageURLChangedEvent); i {
case 0:
return &v.state
@@ -13764,7 +14297,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2TagsChangedEvent); i {
case 0:
return &v.state
@@ -13776,7 +14309,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2OrganizationRoleChangedEvent); i {
case 0:
return &v.state
@@ -13788,7 +14321,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2EnvironmentRolesChangedEvent); i {
case 0:
return &v.state
@@ -13800,7 +14333,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2EnabledEvent); i {
case 0:
return &v.state
@@ -13812,7 +14345,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2DisabledEvent); i {
case 0:
return &v.state
@@ -13824,7 +14357,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2DeletedEvent); i {
case 0:
return &v.state
@@ -13836,7 +14369,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchFilterCreatedEvent); i {
case 0:
return &v.state
@@ -13848,7 +14381,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchFilterNameChangedEvent); i {
case 0:
return &v.state
@@ -13860,7 +14393,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchFilterQueryChangedEvent); i {
case 0:
return &v.state
@@ -13872,7 +14405,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchFilterDefaultChangedEvent); i {
case 0:
return &v.state
@@ -13884,7 +14417,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SearchFilterDeletedEvent); i {
case 0:
return &v.state
@@ -13896,7 +14429,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*APIKeyCreatedEvent); i {
case 0:
return &v.state
@@ -13908,7 +14441,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*APIKeyChangedEvent); i {
case 0:
return &v.state
@@ -13920,7 +14453,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*APIKeyNameChangedEvent); i {
case 0:
return &v.state
@@ -13932,7 +14465,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*APIKeyEnabledEvent); i {
case 0:
return &v.state
@@ -13944,7 +14477,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*APIKeyDisabledEvent); i {
case 0:
return &v.state
@@ -13956,7 +14489,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentCreatedEvent); i {
case 0:
return &v.state
@@ -13968,7 +14501,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentDeletedEvent); i {
case 0:
return &v.state
@@ -13980,7 +14513,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentUpdatedEvent); i {
case 0:
return &v.state
@@ -13992,7 +14525,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentNameChangedEvent); i {
case 0:
return &v.state
@@ -14004,7 +14537,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentDescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14016,7 +14549,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentRuleAddedEvent); i {
case 0:
return &v.state
@@ -14028,7 +14561,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentRuleDeletedEvent); i {
case 0:
return &v.state
@@ -14040,7 +14573,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentRuleClauseAddedEvent); i {
case 0:
return &v.state
@@ -14052,7 +14585,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentRuleClauseDeletedEvent); i {
case 0:
return &v.state
@@ -14064,7 +14597,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentClauseAttributeChangedEvent); i {
case 0:
return &v.state
@@ -14076,7 +14609,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentClauseOperatorChangedEvent); i {
case 0:
return &v.state
@@ -14088,7 +14621,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentClauseValueAddedEvent); i {
case 0:
return &v.state
@@ -14100,7 +14633,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentClauseValueRemovedEvent); i {
case 0:
return &v.state
@@ -14112,7 +14645,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentUserAddedEvent); i {
case 0:
return &v.state
@@ -14124,7 +14657,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentUserDeletedEvent); i {
case 0:
return &v.state
@@ -14136,7 +14669,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentBulkUploadUsersEvent); i {
case 0:
return &v.state
@@ -14148,7 +14681,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SegmentBulkUploadUsersStatusChangedEvent); i {
case 0:
return &v.state
@@ -14160,7 +14693,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentCreatedEvent); i {
case 0:
return &v.state
@@ -14172,7 +14705,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentRenamedEvent); i {
case 0:
return &v.state
@@ -14184,7 +14717,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentDescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14196,7 +14729,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentDeletedEvent); i {
case 0:
return &v.state
@@ -14208,7 +14741,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2CreatedEvent); i {
case 0:
return &v.state
@@ -14220,7 +14753,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2RenamedEvent); i {
case 0:
return &v.state
@@ -14232,7 +14765,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2DescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14244,7 +14777,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2RequireCommentChangedEvent); i {
case 0:
return &v.state
@@ -14256,7 +14789,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2ArchivedEvent); i {
case 0:
return &v.state
@@ -14268,7 +14801,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvironmentV2UnarchivedEvent); i {
case 0:
return &v.state
@@ -14280,7 +14813,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleCreatedEvent); i {
case 0:
return &v.state
@@ -14292,7 +14825,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleStoppedEvent); i {
case 0:
return &v.state
@@ -14304,7 +14837,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleDeletedEvent); i {
case 0:
return &v.state
@@ -14316,7 +14849,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleOpsTypeChangedEvent); i {
case 0:
return &v.state
@@ -14328,7 +14861,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleTriggeredAtChangedEvent); i {
case 0:
return &v.state
@@ -14340,7 +14873,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleOpsStatusChangedEvent); i {
case 0:
return &v.state
@@ -14352,7 +14885,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OpsEventRateClauseAddedEvent); i {
case 0:
return &v.state
@@ -14364,7 +14897,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OpsEventRateClauseChangedEvent); i {
case 0:
return &v.state
@@ -14376,7 +14909,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutoOpsRuleClauseDeletedEvent); i {
case 0:
return &v.state
@@ -14388,7 +14921,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*DatetimeClauseAddedEvent); i {
case 0:
return &v.state
@@ -14400,7 +14933,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*DatetimeClauseChangedEvent); i {
case 0:
return &v.state
@@ -14412,7 +14945,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushCreatedEvent); i {
case 0:
return &v.state
@@ -14424,7 +14957,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushDeletedEvent); i {
case 0:
return &v.state
@@ -14436,7 +14969,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushTagsAddedEvent); i {
case 0:
return &v.state
@@ -14448,7 +14981,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushTagsDeletedEvent); i {
case 0:
return &v.state
@@ -14460,7 +14993,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushRenamedEvent); i {
case 0:
return &v.state
@@ -14472,7 +15005,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushTagsUpdatedEvent); i {
case 0:
return &v.state
@@ -14484,7 +15017,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushUpdatedEvent); i {
case 0:
return &v.state
@@ -14496,7 +15029,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionCreatedEvent); i {
case 0:
return &v.state
@@ -14508,7 +15041,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionDeletedEvent); i {
case 0:
return &v.state
@@ -14520,7 +15053,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionEnabledEvent); i {
case 0:
return &v.state
@@ -14532,7 +15065,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionDisabledEvent); i {
case 0:
return &v.state
@@ -14544,7 +15077,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionSourceTypesAddedEvent); i {
case 0:
return &v.state
@@ -14556,7 +15089,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionSourceTypesDeletedEvent); i {
case 0:
return &v.state
@@ -14568,7 +15101,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionRenamedEvent); i {
case 0:
return &v.state
@@ -14580,7 +15113,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SubscriptionUpdatedEvent); i {
case 0:
return &v.state
@@ -14592,7 +15125,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionCreatedEvent); i {
case 0:
return &v.state
@@ -14604,7 +15137,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionDeletedEvent); i {
case 0:
return &v.state
@@ -14616,7 +15149,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionEnabledEvent); i {
case 0:
return &v.state
@@ -14628,7 +15161,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionDisabledEvent); i {
case 0:
return &v.state
@@ -14640,7 +15173,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionSourceTypesAddedEvent); i {
case 0:
return &v.state
@@ -14652,7 +15185,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionSourceTypesDeletedEvent); i {
case 0:
return &v.state
@@ -14664,7 +15197,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AdminSubscriptionRenamedEvent); i {
case 0:
return &v.state
@@ -14676,7 +15209,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectCreatedEvent); i {
case 0:
return &v.state
@@ -14688,7 +15221,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectDescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14700,7 +15233,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectRenamedEvent); i {
case 0:
return &v.state
@@ -14712,7 +15245,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectEnabledEvent); i {
case 0:
return &v.state
@@ -14724,7 +15257,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectDisabledEvent); i {
case 0:
return &v.state
@@ -14736,7 +15269,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectTrialCreatedEvent); i {
case 0:
return &v.state
@@ -14748,7 +15281,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProjectTrialConvertedEvent); i {
case 0:
return &v.state
@@ -14760,7 +15293,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PrerequisiteAddedEvent); i {
case 0:
return &v.state
@@ -14772,7 +15305,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PrerequisiteVariationChangedEvent); i {
case 0:
return &v.state
@@ -14784,7 +15317,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PrerequisiteRemovedEvent); i {
case 0:
return &v.state
@@ -14796,7 +15329,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProgressiveRolloutCreatedEvent); i {
case 0:
return &v.state
@@ -14808,7 +15341,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProgressiveRolloutStoppedEvent); i {
case 0:
return &v.state
@@ -14820,7 +15353,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProgressiveRolloutDeletedEvent); i {
case 0:
return &v.state
@@ -14832,7 +15365,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProgressiveRolloutScheduleTriggeredAtChangedEvent); i {
case 0:
return &v.state
@@ -14844,7 +15377,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationCreatedEvent); i {
case 0:
return &v.state
@@ -14856,7 +15389,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationDescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14868,7 +15401,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationOwnerEmailChangedEvent); i {
case 0:
return &v.state
@@ -14880,7 +15413,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationNameChangedEvent); i {
case 0:
return &v.state
@@ -14892,7 +15425,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationEnabledEvent); i {
case 0:
return &v.state
@@ -14904,7 +15437,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationDisabledEvent); i {
case 0:
return &v.state
@@ -14916,7 +15449,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationArchivedEvent); i {
case 0:
return &v.state
@@ -14928,7 +15461,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationUnarchivedEvent); i {
case 0:
return &v.state
@@ -14940,7 +15473,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OrganizationTrialConvertedEvent); i {
case 0:
return &v.state
@@ -14952,7 +15485,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerCreatedEvent); i {
case 0:
return &v.state
@@ -14964,7 +15497,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerResetEvent); i {
case 0:
return &v.state
@@ -14976,7 +15509,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerDescriptionChangedEvent); i {
case 0:
return &v.state
@@ -14988,7 +15521,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerDisabledEvent); i {
case 0:
return &v.state
@@ -15000,7 +15533,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerEnabledEvent); i {
case 0:
return &v.state
@@ -15012,7 +15545,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerDeletedEvent); i {
case 0:
return &v.state
@@ -15024,7 +15557,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FlagTriggerUsageUpdatedEvent); i {
case 0:
return &v.state
@@ -15036,7 +15569,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2FirstNameChangedEvent); i {
case 0:
return &v.state
@@ -15048,7 +15581,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2LastNameChangedEvent); i {
case 0:
return &v.state
@@ -15060,7 +15593,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AccountV2LanguageChangedEvent); i {
case 0:
return &v.state
@@ -15072,7 +15605,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TagCreatedEvent); i {
case 0:
return &v.state
@@ -15084,7 +15617,7 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TagDeletedEvent); i {
case 0:
return &v.state
@@ -15096,7 +15629,43 @@ func file_proto_event_domain_event_proto_init() {
return nil
}
}
- file_proto_event_domain_event_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} {
+ file_proto_event_domain_event_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CodeReferenceCreatedEvent); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_event_domain_event_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CodeReferenceUpdatedEvent); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_event_domain_event_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CodeReferenceDeletedEvent); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_event_domain_event_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Editor_PublicAPIEditor); i {
case 0:
return &v.state
@@ -15115,7 +15684,7 @@ func file_proto_event_domain_event_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_event_domain_event_proto_rawDesc,
NumEnums: 2,
- NumMessages: 172,
+ NumMessages: 176,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/proto/event/domain/event.proto b/proto/event/domain/event.proto
index 1174dfdb6c..173ae025cb 100644
--- a/proto/event/domain/event.proto
+++ b/proto/event/domain/event.proto
@@ -38,6 +38,8 @@ import "proto/autoops/progressive_rollout.proto";
import "proto/feature/flag_trigger.proto";
import "proto/account/search_filter.proto";
import "proto/tag/tag.proto";
+import "proto/experiment/goal.proto";
+import "proto/coderef/code_reference.proto";
message Event {
enum EntityType {
@@ -59,6 +61,7 @@ message Event {
ORGANIZATION = 15;
FLAG_TRIGGER = 16;
TAG = 17;
+ CODEREF = 18;
}
enum Type {
UNKNOWN = 0;
@@ -105,6 +108,7 @@ message Event {
GOAL_DESCRIPTION_CHANGED = 102;
GOAL_DELETED = 103;
GOAL_ARCHIVED = 104;
+ GOAL_UPDATED = 105;
EXPERIMENT_CREATED = 200;
EXPERIMENT_STOPPED = 201;
EXPERIMENT_START_AT_CHANGED = 202;
@@ -241,6 +245,9 @@ message Event {
FLAG_TRIGGER_USAGE_UPDATED = 1607;
TAG_CREATED = 1701;
TAG_DELETED = 1702;
+ CODE_REFERENCE_CREATED = 1800;
+ CODE_REFERENCE_UPDATED = 1801;
+ CODE_REFERENCE_DELETED = 1802;
}
string id = 1;
int64 timestamp = 2;
@@ -499,6 +506,13 @@ message GoalCreatedEvent {
bool deleted = 4;
int64 created_at = 5;
int64 updated_at = 6;
+ bucketeer.experiment.Goal.ConnectionType connection_type = 7;
+}
+
+message GoalUpdatedEvent {
+ string id = 1;
+ google.protobuf.StringValue name = 2;
+ google.protobuf.StringValue description = 3;
}
message GoalRenamedEvent {
@@ -1218,3 +1232,39 @@ message TagDeletedEvent {
string id = 1;
string environment_id = 6;
}
+
+message CodeReferenceCreatedEvent {
+ string id = 1;
+ string feature_id = 2;
+ string file_path = 3;
+ int32 line_number = 4;
+ string code_snippet = 5;
+ string content_hash = 6;
+ repeated string aliases = 7;
+ string repository_name = 8;
+ string repository_owner = 9;
+ bucketeer.coderef.CodeReference.RepositoryType repository_type = 10;
+ string repository_branch = 11;
+ string commit_hash = 12;
+ string environment_id = 13;
+ int64 created_at = 14;
+ int64 updated_at = 15;
+}
+
+message CodeReferenceUpdatedEvent {
+ string id = 1;
+ string file_path = 2;
+ int32 line_number = 3;
+ string code_snippet = 4;
+ string content_hash = 5;
+ repeated string aliases = 6;
+ string repository_branch = 7;
+ string commit_hash = 8;
+ string environment_id = 9;
+ int64 updated_at = 10;
+}
+
+message CodeReferenceDeletedEvent {
+ string id = 1;
+ string environment_id = 2;
+}
diff --git a/proto/experiment/command.pb.go b/proto/experiment/command.pb.go
index 81d1e2d602..229c443035 100644
--- a/proto/experiment/command.pb.go
+++ b/proto/experiment/command.pb.go
@@ -39,9 +39,10 @@ type CreateGoalCommand struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
- Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
- Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
+ ConnectionType Goal_ConnectionType `protobuf:"varint,4,opt,name=connection_type,json=connectionType,proto3,enum=bucketeer.experiment.Goal_ConnectionType" json:"connection_type"`
}
func (x *CreateGoalCommand) Reset() {
@@ -97,6 +98,13 @@ func (x *CreateGoalCommand) GetDescription() string {
return ""
}
+func (x *CreateGoalCommand) GetConnectionType() Goal_ConnectionType {
+ if x != nil {
+ return x.ConnectionType
+ }
+ return Goal_UNKNOWN
+}
+
type RenameGoalCommand struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -707,62 +715,69 @@ var file_proto_experiment_command_proto_rawDesc = []byte{
0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x12, 0x14, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x59, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x22, 0x27, 0x0a, 0x11, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x1c, 0x43, 0x68,
- 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47,
- 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x14, 0x0a, 0x12,
- 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
- 0x6e, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c,
- 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xef, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61,
- 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x17, 0x0a,
- 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
- 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x69,
- 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x61, 0x6c, 0x49, 0x64,
- 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f,
- 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x53, 0x0a, 0x1d, 0x43, 0x68, 0x61,
- 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72,
- 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74,
- 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74,
- 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x22, 0x31,
- 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a,
- 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x22, 0x46, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
- 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x74, 0x6f,
- 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
- 0x6e, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x19,
- 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x61,
- 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x34,
- 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f,
+ 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,
+ 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x52, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79,
+ 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x47, 0x6f, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+ 0x79, 0x70, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+ 0x79, 0x70, 0x65, 0x22, 0x27, 0x0a, 0x11, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x6f, 0x61,
+ 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x1c,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x14,
+ 0x0a, 0x12, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f,
+ 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xef, 0x01, 0x0a, 0x17, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12,
+ 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x6f, 0x61, 0x6c,
+ 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x6f, 0x61, 0x6c,
+ 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x73,
+ 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x53, 0x0a, 0x1d, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x50,
+ 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x74,
+ 0x22, 0x31, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
+ 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x53,
+ 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x53,
+ 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -793,13 +808,15 @@ var file_proto_experiment_command_proto_goTypes = []interface{}{
(*DeleteExperimentCommand)(nil), // 11: bucketeer.experiment.DeleteExperimentCommand
(*StartExperimentCommand)(nil), // 12: bucketeer.experiment.StartExperimentCommand
(*FinishExperimentCommand)(nil), // 13: bucketeer.experiment.FinishExperimentCommand
+ (Goal_ConnectionType)(0), // 14: bucketeer.experiment.Goal.ConnectionType
}
var file_proto_experiment_command_proto_depIdxs = []int32{
- 0, // [0:0] is the sub-list for method output_type
- 0, // [0:0] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
+ 14, // 0: bucketeer.experiment.CreateGoalCommand.connection_type:type_name -> bucketeer.experiment.Goal.ConnectionType
+ 1, // [1:1] is the sub-list for method output_type
+ 1, // [1:1] is the sub-list for method input_type
+ 1, // [1:1] is the sub-list for extension type_name
+ 1, // [1:1] is the sub-list for extension extendee
+ 0, // [0:1] is the sub-list for field type_name
}
func init() { file_proto_experiment_command_proto_init() }
@@ -807,6 +824,7 @@ func file_proto_experiment_command_proto_init() {
if File_proto_experiment_command_proto != nil {
return
}
+ file_proto_experiment_goal_proto_init()
if !protoimpl.UnsafeEnabled {
file_proto_experiment_command_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateGoalCommand); i {
diff --git a/proto/experiment/command.proto b/proto/experiment/command.proto
index 3d20ee95e4..fa4939c54f 100644
--- a/proto/experiment/command.proto
+++ b/proto/experiment/command.proto
@@ -17,10 +17,13 @@ syntax = "proto3";
package bucketeer.experiment;
option go_package = "github.com/bucketeer-io/bucketeer/proto/experiment";
+import "proto/experiment/goal.proto";
+
message CreateGoalCommand {
string id = 1;
string name = 2;
string description = 3;
+ Goal.ConnectionType connection_type = 4;
}
message RenameGoalCommand {
diff --git a/proto/experiment/experiment.pb.go b/proto/experiment/experiment.pb.go
index 9573701b30..ebc055bb97 100644
--- a/proto/experiment/experiment.pb.go
+++ b/proto/experiment/experiment.pb.go
@@ -101,18 +101,19 @@ type Experiment struct {
StartAt int64 `protobuf:"varint,6,opt,name=start_at,json=startAt,proto3" json:"start_at"`
StopAt int64 `protobuf:"varint,7,opt,name=stop_at,json=stopAt,proto3" json:"stop_at"`
// Deprecated: Do not use.
- Stopped bool `protobuf:"varint,8,opt,name=stopped,proto3" json:"stopped"`
- StoppedAt int64 `protobuf:"varint,9,opt,name=stopped_at,json=stoppedAt,proto3" json:"stopped_at"`
- CreatedAt int64 `protobuf:"varint,10,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
- UpdatedAt int64 `protobuf:"varint,11,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
- Deleted bool `protobuf:"varint,12,opt,name=deleted,proto3" json:"deleted"`
- GoalIds []string `protobuf:"bytes,13,rep,name=goal_ids,json=goalIds,proto3" json:"goal_ids"`
- Name string `protobuf:"bytes,14,opt,name=name,proto3" json:"name"`
- Description string `protobuf:"bytes,15,opt,name=description,proto3" json:"description"`
- BaseVariationId string `protobuf:"bytes,16,opt,name=base_variation_id,json=baseVariationId,proto3" json:"base_variation_id"`
- Status Experiment_Status `protobuf:"varint,18,opt,name=status,proto3,enum=bucketeer.experiment.Experiment_Status" json:"status"`
- Maintainer string `protobuf:"bytes,19,opt,name=maintainer,proto3" json:"maintainer"`
- Archived bool `protobuf:"varint,20,opt,name=archived,proto3" json:"archived"`
+ Stopped bool `protobuf:"varint,8,opt,name=stopped,proto3" json:"stopped"`
+ StoppedAt int64 `protobuf:"varint,9,opt,name=stopped_at,json=stoppedAt,proto3" json:"stopped_at"`
+ CreatedAt int64 `protobuf:"varint,10,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+ UpdatedAt int64 `protobuf:"varint,11,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+ Deleted bool `protobuf:"varint,12,opt,name=deleted,proto3" json:"deleted"`
+ GoalIds []string `protobuf:"bytes,13,rep,name=goal_ids,json=goalIds,proto3" json:"goal_ids"`
+ Name string `protobuf:"bytes,14,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,15,opt,name=description,proto3" json:"description"`
+ BaseVariationId string `protobuf:"bytes,16,opt,name=base_variation_id,json=baseVariationId,proto3" json:"base_variation_id"`
+ Status Experiment_Status `protobuf:"varint,18,opt,name=status,proto3,enum=bucketeer.experiment.Experiment_Status" json:"status"`
+ Maintainer string `protobuf:"bytes,19,opt,name=maintainer,proto3" json:"maintainer"`
+ Archived bool `protobuf:"varint,20,opt,name=archived,proto3" json:"archived"`
+ Goals []*Experiment_GoalReference `protobuf:"bytes,21,rep,name=goals,proto3" json:"goals"`
}
func (x *Experiment) Reset() {
@@ -282,6 +283,13 @@ func (x *Experiment) GetArchived() bool {
return false
}
+func (x *Experiment) GetGoals() []*Experiment_GoalReference {
+ if x != nil {
+ return x.Goals
+ }
+ return nil
+}
+
type Experiments struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -329,6 +337,61 @@ func (x *Experiments) GetExperiments() []*Experiment {
return nil
}
+type Experiment_GoalReference struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+}
+
+func (x *Experiment_GoalReference) Reset() {
+ *x = Experiment_GoalReference{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_experiment_experiment_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Experiment_GoalReference) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Experiment_GoalReference) ProtoMessage() {}
+
+func (x *Experiment_GoalReference) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_experiment_experiment_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Experiment_GoalReference.ProtoReflect.Descriptor instead.
+func (*Experiment_GoalReference) Descriptor() ([]byte, []int) {
+ return file_proto_experiment_experiment_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Experiment_GoalReference) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *Experiment_GoalReference) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
var File_proto_experiment_experiment_proto protoreflect.FileDescriptor
var file_proto_experiment_experiment_proto_rawDesc = []byte{
@@ -337,7 +400,7 @@ var file_proto_experiment_experiment_proto_rawDesc = []byte{
0x6f, 0x74, 0x6f, 0x12, 0x14, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd0, 0x05, 0x0a, 0x0a, 0x45, 0x78, 0x70,
+ 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcb, 0x06, 0x0a, 0x0a, 0x45, 0x78, 0x70,
0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x07, 0x67, 0x6f, 0x61, 0x6c, 0x5f,
0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x67, 0x6f,
@@ -378,20 +441,28 @@ var file_proto_experiment_experiment_proto_rawDesc = []byte{
0x6e, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74,
0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
- 0x64, 0x22, 0x42, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x57,
- 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e,
- 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44,
- 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50,
- 0x50, 0x45, 0x44, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x22, 0x51, 0x0a, 0x0b, 0x45,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x0b, 0x65, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x34,
- 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x64, 0x12, 0x44, 0x0a, 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x52, 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x1a, 0x33, 0x0a, 0x0d, 0x47, 0x6f, 0x61, 0x6c, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x06,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e,
+ 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01,
+ 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a,
+ 0x0d, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x03,
+ 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x22, 0x51, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74,
+ 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62,
+ 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -407,22 +478,24 @@ func file_proto_experiment_experiment_proto_rawDescGZIP() []byte {
}
var file_proto_experiment_experiment_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_proto_experiment_experiment_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_proto_experiment_experiment_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_proto_experiment_experiment_proto_goTypes = []interface{}{
- (Experiment_Status)(0), // 0: bucketeer.experiment.Experiment.Status
- (*Experiment)(nil), // 1: bucketeer.experiment.Experiment
- (*Experiments)(nil), // 2: bucketeer.experiment.Experiments
- (*feature.Variation)(nil), // 3: bucketeer.feature.Variation
+ (Experiment_Status)(0), // 0: bucketeer.experiment.Experiment.Status
+ (*Experiment)(nil), // 1: bucketeer.experiment.Experiment
+ (*Experiments)(nil), // 2: bucketeer.experiment.Experiments
+ (*Experiment_GoalReference)(nil), // 3: bucketeer.experiment.Experiment.GoalReference
+ (*feature.Variation)(nil), // 4: bucketeer.feature.Variation
}
var file_proto_experiment_experiment_proto_depIdxs = []int32{
- 3, // 0: bucketeer.experiment.Experiment.variations:type_name -> bucketeer.feature.Variation
+ 4, // 0: bucketeer.experiment.Experiment.variations:type_name -> bucketeer.feature.Variation
0, // 1: bucketeer.experiment.Experiment.status:type_name -> bucketeer.experiment.Experiment.Status
- 1, // 2: bucketeer.experiment.Experiments.experiments:type_name -> bucketeer.experiment.Experiment
- 3, // [3:3] is the sub-list for method output_type
- 3, // [3:3] is the sub-list for method input_type
- 3, // [3:3] is the sub-list for extension type_name
- 3, // [3:3] is the sub-list for extension extendee
- 0, // [0:3] is the sub-list for field type_name
+ 3, // 2: bucketeer.experiment.Experiment.goals:type_name -> bucketeer.experiment.Experiment.GoalReference
+ 1, // 3: bucketeer.experiment.Experiments.experiments:type_name -> bucketeer.experiment.Experiment
+ 4, // [4:4] is the sub-list for method output_type
+ 4, // [4:4] is the sub-list for method input_type
+ 4, // [4:4] is the sub-list for extension type_name
+ 4, // [4:4] is the sub-list for extension extendee
+ 0, // [0:4] is the sub-list for field type_name
}
func init() { file_proto_experiment_experiment_proto_init() }
@@ -455,6 +528,18 @@ func file_proto_experiment_experiment_proto_init() {
return nil
}
}
+ file_proto_experiment_experiment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Experiment_GoalReference); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -462,7 +547,7 @@ func file_proto_experiment_experiment_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_experiment_experiment_proto_rawDesc,
NumEnums: 1,
- NumMessages: 2,
+ NumMessages: 3,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/proto/experiment/experiment.proto b/proto/experiment/experiment.proto
index 78e6e9ad4f..acbbef0f8b 100644
--- a/proto/experiment/experiment.proto
+++ b/proto/experiment/experiment.proto
@@ -20,6 +20,10 @@ option go_package = "github.com/bucketeer-io/bucketeer/proto/experiment";
import "proto/feature/variation.proto";
message Experiment {
+ message GoalReference {
+ string id = 1;
+ string name = 2;
+ }
enum Status {
WAITING = 0;
RUNNING = 1;
@@ -46,6 +50,7 @@ message Experiment {
Status status = 18;
string maintainer = 19;
bool archived = 20;
+ repeated GoalReference goals = 21;
}
message Experiments {
diff --git a/proto/experiment/goal.pb.go b/proto/experiment/goal.pb.go
index 7164d701e4..3117d153ce 100644
--- a/proto/experiment/goal.pb.go
+++ b/proto/experiment/goal.pb.go
@@ -21,6 +21,7 @@
package experiment
import (
+ autoops "github.com/bucketeer-io/bucketeer/proto/autoops"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
@@ -34,19 +35,71 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
+type Goal_ConnectionType int32
+
+const (
+ Goal_UNKNOWN Goal_ConnectionType = 0
+ Goal_EXPERIMENT Goal_ConnectionType = 1
+ Goal_OPERATION Goal_ConnectionType = 2
+)
+
+// Enum value maps for Goal_ConnectionType.
+var (
+ Goal_ConnectionType_name = map[int32]string{
+ 0: "UNKNOWN",
+ 1: "EXPERIMENT",
+ 2: "OPERATION",
+ }
+ Goal_ConnectionType_value = map[string]int32{
+ "UNKNOWN": 0,
+ "EXPERIMENT": 1,
+ "OPERATION": 2,
+ }
+)
+
+func (x Goal_ConnectionType) Enum() *Goal_ConnectionType {
+ p := new(Goal_ConnectionType)
+ *p = x
+ return p
+}
+
+func (x Goal_ConnectionType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Goal_ConnectionType) Descriptor() protoreflect.EnumDescriptor {
+ return file_proto_experiment_goal_proto_enumTypes[0].Descriptor()
+}
+
+func (Goal_ConnectionType) Type() protoreflect.EnumType {
+ return &file_proto_experiment_goal_proto_enumTypes[0]
+}
+
+func (x Goal_ConnectionType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Goal_ConnectionType.Descriptor instead.
+func (Goal_ConnectionType) EnumDescriptor() ([]byte, []int) {
+ return file_proto_experiment_goal_proto_rawDescGZIP(), []int{0, 0}
+}
+
type Goal struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
- Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
- Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
- Deleted bool `protobuf:"varint,4,opt,name=deleted,proto3" json:"deleted"`
- CreatedAt int64 `protobuf:"varint,5,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
- UpdatedAt int64 `protobuf:"varint,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
- IsInUseStatus bool `protobuf:"varint,7,opt,name=is_in_use_status,json=isInUseStatus,proto3" json:"is_in_use_status"` // This field is set only when APIs return.
- Archived bool `protobuf:"varint,8,opt,name=archived,proto3" json:"archived"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description"`
+ Deleted bool `protobuf:"varint,4,opt,name=deleted,proto3" json:"deleted"`
+ CreatedAt int64 `protobuf:"varint,5,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+ UpdatedAt int64 `protobuf:"varint,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at"`
+ IsInUseStatus bool `protobuf:"varint,7,opt,name=is_in_use_status,json=isInUseStatus,proto3" json:"is_in_use_status"` // This field is set only when APIs return.
+ Archived bool `protobuf:"varint,8,opt,name=archived,proto3" json:"archived"`
+ ConnectionType Goal_ConnectionType `protobuf:"varint,9,opt,name=connection_type,json=connectionType,proto3,enum=bucketeer.experiment.Goal_ConnectionType" json:"connection_type"`
+ Experiments []*Experiment `protobuf:"bytes,10,rep,name=experiments,proto3" json:"experiments"`
+ AutoOpsRules []*autoops.AutoOpsRule `protobuf:"bytes,11,rep,name=auto_ops_rules,json=autoOpsRules,proto3" json:"auto_ops_rules"`
}
func (x *Goal) Reset() {
@@ -137,31 +190,74 @@ func (x *Goal) GetArchived() bool {
return false
}
+func (x *Goal) GetConnectionType() Goal_ConnectionType {
+ if x != nil {
+ return x.ConnectionType
+ }
+ return Goal_UNKNOWN
+}
+
+func (x *Goal) GetExperiments() []*Experiment {
+ if x != nil {
+ return x.Experiments
+ }
+ return nil
+}
+
+func (x *Goal) GetAutoOpsRules() []*autoops.AutoOpsRule {
+ if x != nil {
+ return x.AutoOpsRules
+ }
+ return nil
+}
+
var File_proto_experiment_goal_proto protoreflect.FileDescriptor
var file_proto_experiment_goal_proto_rawDesc = []byte{
0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
- 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
- 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
- 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x10, 0x69, 0x73,
- 0x5f, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07,
- 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x65, 0x53, 0x74, 0x61,
- 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18,
- 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x42,
- 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x65, 0x6e, 0x74, 0x1a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75,
+ 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x72,
+ 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x04, 0x0a, 0x04, 0x47, 0x6f,
+ 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65,
+ 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74,
+ 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
+ 0x12, 0x27, 0x0a, 0x10, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x49, 0x6e,
+ 0x55, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x63,
+ 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x72, 0x63,
+ 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x52, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x44, 0x0a,
+ 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18,
+ 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70,
+ 0x73, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x73, 0x52, 0x75,
+ 0x6c, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,
+ 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54,
+ 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10,
+ 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -176,16 +272,23 @@ func file_proto_experiment_goal_proto_rawDescGZIP() []byte {
return file_proto_experiment_goal_proto_rawDescData
}
+var file_proto_experiment_goal_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_proto_experiment_goal_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_proto_experiment_goal_proto_goTypes = []interface{}{
- (*Goal)(nil), // 0: bucketeer.experiment.Goal
+ (Goal_ConnectionType)(0), // 0: bucketeer.experiment.Goal.ConnectionType
+ (*Goal)(nil), // 1: bucketeer.experiment.Goal
+ (*Experiment)(nil), // 2: bucketeer.experiment.Experiment
+ (*autoops.AutoOpsRule)(nil), // 3: bucketeer.autoops.AutoOpsRule
}
var file_proto_experiment_goal_proto_depIdxs = []int32{
- 0, // [0:0] is the sub-list for method output_type
- 0, // [0:0] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
+ 0, // 0: bucketeer.experiment.Goal.connection_type:type_name -> bucketeer.experiment.Goal.ConnectionType
+ 2, // 1: bucketeer.experiment.Goal.experiments:type_name -> bucketeer.experiment.Experiment
+ 3, // 2: bucketeer.experiment.Goal.auto_ops_rules:type_name -> bucketeer.autoops.AutoOpsRule
+ 3, // [3:3] is the sub-list for method output_type
+ 3, // [3:3] is the sub-list for method input_type
+ 3, // [3:3] is the sub-list for extension type_name
+ 3, // [3:3] is the sub-list for extension extendee
+ 0, // [0:3] is the sub-list for field type_name
}
func init() { file_proto_experiment_goal_proto_init() }
@@ -193,6 +296,7 @@ func file_proto_experiment_goal_proto_init() {
if File_proto_experiment_goal_proto != nil {
return
}
+ file_proto_experiment_experiment_proto_init()
if !protoimpl.UnsafeEnabled {
file_proto_experiment_goal_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Goal); i {
@@ -212,13 +316,14 @@ func file_proto_experiment_goal_proto_init() {
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_experiment_goal_proto_rawDesc,
- NumEnums: 0,
+ NumEnums: 1,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_proto_experiment_goal_proto_goTypes,
DependencyIndexes: file_proto_experiment_goal_proto_depIdxs,
+ EnumInfos: file_proto_experiment_goal_proto_enumTypes,
MessageInfos: file_proto_experiment_goal_proto_msgTypes,
}.Build()
File_proto_experiment_goal_proto = out.File
diff --git a/proto/experiment/goal.proto b/proto/experiment/goal.proto
index 8c2bfeb99d..4c75d9b51e 100644
--- a/proto/experiment/goal.proto
+++ b/proto/experiment/goal.proto
@@ -17,7 +17,15 @@ syntax = "proto3";
package bucketeer.experiment;
option go_package = "github.com/bucketeer-io/bucketeer/proto/experiment";
+import "proto/experiment/experiment.proto";
+import "proto/autoops/auto_ops_rule.proto";
+
message Goal {
+ enum ConnectionType {
+ UNKNOWN = 0;
+ EXPERIMENT = 1;
+ OPERATION = 2;
+ }
string id = 1;
string name = 2;
string description = 3;
@@ -26,4 +34,7 @@ message Goal {
int64 updated_at = 6;
bool is_in_use_status = 7; // This field is set only when APIs return.
bool archived = 8;
+ ConnectionType connection_type = 9;
+ repeated Experiment experiments = 10;
+ repeated autoops.AutoOpsRule auto_ops_rules = 11;
}
diff --git a/proto/experiment/proto_descriptor.pb b/proto/experiment/proto_descriptor.pb
index 3edd061923..e136abc0ef 100644
Binary files a/proto/experiment/proto_descriptor.pb and b/proto/experiment/proto_descriptor.pb differ
diff --git a/proto/experiment/service.pb.go b/proto/experiment/service.pb.go
index 74bb8dca35..86d72351ec 100644
--- a/proto/experiment/service.pb.go
+++ b/proto/experiment/service.pb.go
@@ -44,10 +44,11 @@ const (
type ListGoalsRequest_OrderBy int32
const (
- ListGoalsRequest_DEFAULT ListGoalsRequest_OrderBy = 0
- ListGoalsRequest_NAME ListGoalsRequest_OrderBy = 1
- ListGoalsRequest_CREATED_AT ListGoalsRequest_OrderBy = 2
- ListGoalsRequest_UPDATED_AT ListGoalsRequest_OrderBy = 3
+ ListGoalsRequest_DEFAULT ListGoalsRequest_OrderBy = 0
+ ListGoalsRequest_NAME ListGoalsRequest_OrderBy = 1
+ ListGoalsRequest_CREATED_AT ListGoalsRequest_OrderBy = 2
+ ListGoalsRequest_UPDATED_AT ListGoalsRequest_OrderBy = 3
+ ListGoalsRequest_CONNECTION_TYPE ListGoalsRequest_OrderBy = 4
)
// Enum value maps for ListGoalsRequest_OrderBy.
@@ -57,12 +58,14 @@ var (
1: "NAME",
2: "CREATED_AT",
3: "UPDATED_AT",
+ 4: "CONNECTION_TYPE",
}
ListGoalsRequest_OrderBy_value = map[string]int32{
- "DEFAULT": 0,
- "NAME": 1,
- "CREATED_AT": 2,
- "UPDATED_AT": 3,
+ "DEFAULT": 0,
+ "NAME": 1,
+ "CREATED_AT": 2,
+ "UPDATED_AT": 3,
+ "CONNECTION_TYPE": 4,
}
)
@@ -511,11 +514,12 @@ type CreateGoalRequest struct {
unknownFields protoimpl.UnknownFields
// Deprecated: Do not use.
- Command *CreateGoalCommand `protobuf:"bytes,1,opt,name=command,proto3" json:"command"`
- EnvironmentId string `protobuf:"bytes,3,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
- Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id"`
- Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name"`
- Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description"`
+ Command *CreateGoalCommand `protobuf:"bytes,1,opt,name=command,proto3" json:"command"`
+ EnvironmentId string `protobuf:"bytes,3,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id"`
+ Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description"`
+ ConnectionType Goal_ConnectionType `protobuf:"varint,7,opt,name=connection_type,json=connectionType,proto3,enum=bucketeer.experiment.Goal_ConnectionType" json:"connection_type"`
}
func (x *CreateGoalRequest) Reset() {
@@ -586,6 +590,13 @@ func (x *CreateGoalRequest) GetDescription() string {
return ""
}
+func (x *CreateGoalRequest) GetConnectionType() Goal_ConnectionType {
+ if x != nil {
+ return x.ConnectionType
+ }
+ return Goal_UNKNOWN
+}
+
type CreateGoalResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -739,7 +750,8 @@ type DeleteGoalRequest struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ // Deprecated: Do not use.
Command *DeleteGoalCommand `protobuf:"bytes,2,opt,name=command,proto3" json:"command"`
EnvironmentId string `protobuf:"bytes,4,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
}
@@ -783,6 +795,7 @@ func (x *DeleteGoalRequest) GetId() string {
return ""
}
+// Deprecated: Do not use.
func (x *DeleteGoalRequest) GetCommand() *DeleteGoalCommand {
if x != nil {
return x.Command
@@ -840,10 +853,15 @@ type UpdateGoalRequest struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
- RenameCommand *RenameGoalCommand `protobuf:"bytes,2,opt,name=rename_command,json=renameCommand,proto3" json:"rename_command"`
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ // Deprecated: Do not use.
+ RenameCommand *RenameGoalCommand `protobuf:"bytes,2,opt,name=rename_command,json=renameCommand,proto3" json:"rename_command"`
+ // Deprecated: Do not use.
ChangeDescriptionCommand *ChangeDescriptionGoalCommand `protobuf:"bytes,3,opt,name=change_description_command,json=changeDescriptionCommand,proto3" json:"change_description_command"`
EnvironmentId string `protobuf:"bytes,5,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ Name *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=name,proto3" json:"name"`
+ Description *wrapperspb.StringValue `protobuf:"bytes,7,opt,name=description,proto3" json:"description"`
+ Archived *wrapperspb.BoolValue `protobuf:"bytes,8,opt,name=archived,proto3" json:"archived"`
}
func (x *UpdateGoalRequest) Reset() {
@@ -885,6 +903,7 @@ func (x *UpdateGoalRequest) GetId() string {
return ""
}
+// Deprecated: Do not use.
func (x *UpdateGoalRequest) GetRenameCommand() *RenameGoalCommand {
if x != nil {
return x.RenameCommand
@@ -892,6 +911,7 @@ func (x *UpdateGoalRequest) GetRenameCommand() *RenameGoalCommand {
return nil
}
+// Deprecated: Do not use.
func (x *UpdateGoalRequest) GetChangeDescriptionCommand() *ChangeDescriptionGoalCommand {
if x != nil {
return x.ChangeDescriptionCommand
@@ -906,10 +926,33 @@ func (x *UpdateGoalRequest) GetEnvironmentId() string {
return ""
}
+func (x *UpdateGoalRequest) GetName() *wrapperspb.StringValue {
+ if x != nil {
+ return x.Name
+ }
+ return nil
+}
+
+func (x *UpdateGoalRequest) GetDescription() *wrapperspb.StringValue {
+ if x != nil {
+ return x.Description
+ }
+ return nil
+}
+
+func (x *UpdateGoalRequest) GetArchived() *wrapperspb.BoolValue {
+ if x != nil {
+ return x.Archived
+ }
+ return nil
+}
+
type UpdateGoalResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
+
+ Goal *Goal `protobuf:"bytes,1,opt,name=goal,proto3" json:"goal"`
}
func (x *UpdateGoalResponse) Reset() {
@@ -944,6 +987,13 @@ func (*UpdateGoalResponse) Descriptor() ([]byte, []int) {
return file_proto_experiment_service_proto_rawDescGZIP(), []int{11}
}
+func (x *UpdateGoalResponse) GetGoal() *Goal {
+ if x != nil {
+ return x.Goal
+ }
+ return nil
+}
+
type GetExperimentRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1202,9 +1252,10 @@ type ListExperimentsResponse struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Experiments []*Experiment `protobuf:"bytes,1,rep,name=experiments,proto3" json:"experiments"`
- Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor"`
- TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count"`
+ Experiments []*Experiment `protobuf:"bytes,1,rep,name=experiments,proto3" json:"experiments"`
+ Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor"`
+ TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count"`
+ Summary *ListExperimentsResponse_Summary `protobuf:"bytes,4,opt,name=summary,proto3" json:"summary"`
}
func (x *ListExperimentsResponse) Reset() {
@@ -1260,13 +1311,28 @@ func (x *ListExperimentsResponse) GetTotalCount() int64 {
return 0
}
+func (x *ListExperimentsResponse) GetSummary() *ListExperimentsResponse_Summary {
+ if x != nil {
+ return x.Summary
+ }
+ return nil
+}
+
type CreateExperimentRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Command *CreateExperimentCommand `protobuf:"bytes,1,opt,name=command,proto3" json:"command"`
- EnvironmentId string `protobuf:"bytes,3,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ // Deprecated: Do not use.
+ Command *CreateExperimentCommand `protobuf:"bytes,1,opt,name=command,proto3" json:"command"`
+ EnvironmentId string `protobuf:"bytes,3,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ FeatureId string `protobuf:"bytes,4,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ StartAt int64 `protobuf:"varint,5,opt,name=start_at,json=startAt,proto3" json:"start_at"`
+ StopAt int64 `protobuf:"varint,6,opt,name=stop_at,json=stopAt,proto3" json:"stop_at"`
+ GoalIds []string `protobuf:"bytes,7,rep,name=goal_ids,json=goalIds,proto3" json:"goal_ids"`
+ Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name"`
+ Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description"`
+ BaseVariationId string `protobuf:"bytes,10,opt,name=base_variation_id,json=baseVariationId,proto3" json:"base_variation_id"`
}
func (x *CreateExperimentRequest) Reset() {
@@ -1301,6 +1367,7 @@ func (*CreateExperimentRequest) Descriptor() ([]byte, []int) {
return file_proto_experiment_service_proto_rawDescGZIP(), []int{16}
}
+// Deprecated: Do not use.
func (x *CreateExperimentRequest) GetCommand() *CreateExperimentCommand {
if x != nil {
return x.Command
@@ -1315,6 +1382,55 @@ func (x *CreateExperimentRequest) GetEnvironmentId() string {
return ""
}
+func (x *CreateExperimentRequest) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+func (x *CreateExperimentRequest) GetStartAt() int64 {
+ if x != nil {
+ return x.StartAt
+ }
+ return 0
+}
+
+func (x *CreateExperimentRequest) GetStopAt() int64 {
+ if x != nil {
+ return x.StopAt
+ }
+ return 0
+}
+
+func (x *CreateExperimentRequest) GetGoalIds() []string {
+ if x != nil {
+ return x.GoalIds
+ }
+ return nil
+}
+
+func (x *CreateExperimentRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *CreateExperimentRequest) GetDescription() string {
+ if x != nil {
+ return x.Description
+ }
+ return ""
+}
+
+func (x *CreateExperimentRequest) GetBaseVariationId() string {
+ if x != nil {
+ return x.BaseVariationId
+ }
+ return ""
+}
+
type CreateExperimentResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1984,6 +2100,69 @@ func (*DeleteExperimentResponse) Descriptor() ([]byte, []int) {
return file_proto_experiment_service_proto_rawDescGZIP(), []int{29}
}
+type ListExperimentsResponse_Summary struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ TotalWaitingCount int64 `protobuf:"varint,1,opt,name=total_waiting_count,json=totalWaitingCount,proto3" json:"total_waiting_count"`
+ TotalRunningCount int64 `protobuf:"varint,2,opt,name=total_running_count,json=totalRunningCount,proto3" json:"total_running_count"`
+ TotalStoppedCount int64 `protobuf:"varint,3,opt,name=total_stopped_count,json=totalStoppedCount,proto3" json:"total_stopped_count"`
+}
+
+func (x *ListExperimentsResponse_Summary) Reset() {
+ *x = ListExperimentsResponse_Summary{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_experiment_service_proto_msgTypes[30]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListExperimentsResponse_Summary) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListExperimentsResponse_Summary) ProtoMessage() {}
+
+func (x *ListExperimentsResponse_Summary) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_experiment_service_proto_msgTypes[30]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListExperimentsResponse_Summary.ProtoReflect.Descriptor instead.
+func (*ListExperimentsResponse_Summary) Descriptor() ([]byte, []int) {
+ return file_proto_experiment_service_proto_rawDescGZIP(), []int{15, 0}
+}
+
+func (x *ListExperimentsResponse_Summary) GetTotalWaitingCount() int64 {
+ if x != nil {
+ return x.TotalWaitingCount
+ }
+ return 0
+}
+
+func (x *ListExperimentsResponse_Summary) GetTotalRunningCount() int64 {
+ if x != nil {
+ return x.TotalRunningCount
+ }
+ return 0
+}
+
+func (x *ListExperimentsResponse_Summary) GetTotalStoppedCount() int64 {
+ if x != nil {
+ return x.TotalStoppedCount
+ }
+ return 0
+}
+
var File_proto_experiment_service_proto protoreflect.FileDescriptor
var file_proto_experiment_service_proto_rawDesc = []byte{
@@ -2015,7 +2194,7 @@ var file_proto_experiment_service_proto_rawDesc = []byte{
0x65, 0x12, 0x2e, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x04, 0x67, 0x6f, 0x61,
- 0x6c, 0x22, 0xaf, 0x04, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52,
+ 0x6c, 0x22, 0xc4, 0x04, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,
0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,
0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20,
@@ -2043,299 +2222,572 @@ var file_proto_experiment_service_proto_rawDesc = []byte{
0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x6e,
0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01,
0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x07, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42,
+ 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x07, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42,
0x79, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08,
0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x52, 0x45, 0x41,
0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x50, 0x44, 0x41,
- 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x03, 0x22, 0x23, 0x0a, 0x0e, 0x4f, 0x72, 0x64, 0x65,
- 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53,
- 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x4a, 0x04, 0x08,
- 0x03, 0x10, 0x04, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x67, 0x6f, 0x61, 0x6c,
- 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47,
- 0x6f, 0x61, 0x6c, 0x52, 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75,
- 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73,
- 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f,
- 0x75, 0x6e, 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f,
- 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x07, 0x63, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x42, 0x11, 0x18, 0x01, 0x92, 0x41, 0x0c, 0x32, 0x0a, 0x64, 0x65, 0x70, 0x72,
- 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
- 0x2a, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
- 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x6e,
- 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x13, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64,
- 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
- 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
- 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
- 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10,
- 0x03, 0x22, 0x44, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52,
+ 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x4e,
+ 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x04, 0x22, 0x23, 0x0a,
+ 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43,
+ 0x10, 0x01, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74,
+ 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a,
+ 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x05, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x12,
+ 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c,
+ 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f,
+ 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbf, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54,
+ 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61,
+ 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x11, 0x18, 0x01, 0x92, 0x41, 0x0c, 0x32,
+ 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
+ 0x02, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
+ 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
+ 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,
+ 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x52, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x44, 0x0a, 0x12, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x12, 0x2e, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c,
+ 0x22, 0x95, 0x01, 0x0a, 0x12, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+ 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0xb0, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x54, 0x0a, 0x07, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x11, 0x18, 0x01, 0x92, 0x41, 0x0c, 0x32, 0x0a, 0x64, 0x65, 0x70,
+ 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03,
+ 0x10, 0x04, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x04, 0x0a, 0x11, 0x55, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x13,
+ 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
+ 0x02, 0x69, 0x64, 0x12, 0x61, 0x0a, 0x0e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x11, 0x18, 0x01, 0x92, 0x41, 0x0c, 0x32, 0x0a, 0x64, 0x65, 0x70,
+ 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x43,
+ 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, 0x01, 0x0a, 0x1a, 0x63, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42,
+ 0x11, 0x18, 0x01, 0x92, 0x41, 0x0c, 0x32, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74,
+ 0x65, 0x64, 0x52, 0x18, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x0e,
+ 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x08, 0x61, 0x72,
+ 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42,
+ 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x27, 0x92, 0x41, 0x24, 0x32, 0x22, 0x69,
+ 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6f, 0x61, 0x6c,
+ 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+ 0x64, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10,
+ 0x05, 0x22, 0x44, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18,
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x61,
- 0x6c, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x41, 0x72, 0x63, 0x68,
- 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e,
- 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42,
- 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f,
- 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
- 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22,
- 0x15, 0x0a, 0x13, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74,
- 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x07,
- 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x43,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
+ 0x6c, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
- 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x14, 0x0a, 0x12,
- 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61,
- 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x72, 0x65, 0x6e, 0x61,
- 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x47, 0x6f,
- 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d,
- 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x70, 0x0a, 0x1a, 0x63, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x59, 0x0a, 0x15,
+ 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74,
+ 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
+ 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74,
+ 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74,
+ 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x70,
+ 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08,
+ 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73,
+ 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72,
+ 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62,
+ 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c,
+ 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x64, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x3b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72,
+ 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e,
+ 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0c,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18,
+ 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x73,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73,
+ 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x07,
+ 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55,
+ 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x0e,
+ 0x0a, 0x0a, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e,
+ 0x0a, 0x0a, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x03, 0x22, 0x23,
+ 0x0a, 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53,
+ 0x43, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x83, 0x03, 0x0a, 0x17, 0x4c, 0x69,
+ 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72,
+ 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f,
+ 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75,
+ 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x2e, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d,
+ 0x61, 0x72, 0x79, 0x1a, 0x99, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12,
+ 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67,
+ 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f,
+ 0x74, 0x61, 0x6c, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+ 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67,
+ 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f,
+ 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+ 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
+ 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f,
+ 0x74, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22,
+ 0x95, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x07, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x11, 0x18, 0x01, 0x92,
+ 0x41, 0x0c, 0x32, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x07,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
+ 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73,
+ 0x74, 0x6f, 0x70, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x69, 0x64,
+ 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x67, 0x6f,
+ 0x61, 0x6c, 0x49, 0x64, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,
+ 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x2f, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02,
+ 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+ 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x5c, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xbb, 0x03, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
+ 0x64, 0x12, 0x7c, 0x0a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x52, 0x1d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
+ 0x61, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52,
+ 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x12, 0x76, 0x0a, 0x1a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
0x52, 0x18, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e,
- 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49,
- 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x14, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74,
- 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a,
- 0x14, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x02,
- 0x10, 0x03, 0x22, 0x59, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x65,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x9a, 0x06,
- 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
- 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
- 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x72, 0x6f,
- 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74,
- 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16,
- 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
- 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
- 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61,
- 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6d,
- 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x08, 0x6f,
- 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65,
- 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x64, 0x0a, 0x0f,
- 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18,
- 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73,
- 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79,
- 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72,
- 0x63, 0x68, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x61, 0x72, 0x63,
- 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f,
- 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
- 0x64, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x0e, 0x20,
- 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74,
- 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
- 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x40, 0x0a,
- 0x07, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41,
- 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12,
- 0x0e, 0x0a, 0x0a, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x02, 0x12,
- 0x0e, 0x0a, 0x0a, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x03, 0x22,
- 0x23, 0x0a, 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45,
- 0x53, 0x43, 0x10, 0x01, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x96, 0x01, 0x0a, 0x17, 0x4c,
- 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75,
+ 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08,
+ 0x04, 0x10, 0x05, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0x9d, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75,
- 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73,
- 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f,
- 0x75, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
- 0x47, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52,
- 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a,
- 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x5c, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x22, 0xbb, 0x03, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
- 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
- 0x7c, 0x0a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x1d,
- 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x61, 0x0a,
- 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x11, 0x63,
- 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
- 0x12, 0x76, 0x0a, 0x1a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x07,
- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e,
- 0x67, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x18,
- 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
- 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a,
- 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10,
- 0x05, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9d, 0x01,
- 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d,
- 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
- 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
- 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x19, 0x0a,
- 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x46, 0x69, 0x6e,
- 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6e,
- 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a,
- 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
- 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x1a, 0x0a, 0x18, 0x46, 0x69,
- 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x45,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
- 0x12, 0x45, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70,
+ 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
+ 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22,
+ 0x19, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x46,
+ 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46,
+ 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43,
+ 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12,
+ 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
+ 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x1a, 0x0a, 0x18,
+ 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x6f,
+ 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x45, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
+ 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76,
+ 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
+ 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0xa1, 0x01, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x48, 0x0a,
+ 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70,
0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07,
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72,
0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04,
- 0x08, 0x03, 0x10, 0x04, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1,
- 0x01, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x63,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62,
+ 0x08, 0x03, 0x10, 0x04, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a,
+ 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
+ 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08,
+ 0x03, 0x10, 0x04, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32,
+ 0xbd, 0x28, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x82, 0x04, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x61,
+ 0x6c, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x61, 0x6c,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47,
+ 0x65, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9,
+ 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61,
+ 0x6c, 0x92, 0x41, 0x95, 0x03, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x03, 0x47, 0x65, 0x74,
+ 0x1a, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x2a, 0x0f, 0x77,
+ 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0xb4,
+ 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72,
+ 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61,
+ 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a,
+ 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f,
+ 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20,
+ 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01,
+ 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65,
+ 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61,
+ 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x8c, 0x04, 0x0a, 0x09, 0x4c,
+ 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c,
+ 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x03, 0x82, 0xd3, 0xe4, 0x93,
+ 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x92, 0x41, 0x98,
+ 0x03, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x0b, 0x4c,
+ 0x69, 0x73, 0x74, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x2e, 0x2a, 0x11, 0x77, 0x65, 0x62, 0x2e,
+ 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x4a, 0xb4, 0x01,
+ 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e,
+ 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76,
+ 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10,
+ 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e,
+ 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22,
+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20,
+ 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a,
+ 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16,
+ 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63,
+ 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
+ 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69,
+ 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x97, 0x04, 0x0a, 0x0a, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47,
+ 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x03, 0x82, 0xd3,
+ 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x3a, 0x01,
+ 0x2a, 0x92, 0x41, 0x9e, 0x03, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x06, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x67, 0x6f,
+ 0x61, 0x6c, 0x2e, 0x2a, 0x12, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c,
+ 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12,
+ 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c,
+ 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16,
+ 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63,
+ 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22,
+ 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2,
+ 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61,
+ 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65,
+ 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f,
+ 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20,
+ 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22,
+ 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65,
+ 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b,
+ 0x5d, 0x20, 0x7d, 0x12, 0x97, 0x04, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f,
+ 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x32, 0x08,
+ 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x9e, 0x03, 0x0a,
+ 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x2a, 0x12, 0x77,
+ 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65,
+ 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79,
+ 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f,
+ 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20,
+ 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69,
+ 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c,
+ 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31,
+ 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75,
+ 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
+ 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70,
+ 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d,
+ 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75,
+ 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64,
+ 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x64, 0x0a,
+ 0x0b, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x28, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f,
- 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03,
- 0x10, 0x04, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
- 0x9f, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
- 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x07, 0x63,
- 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62,
+ 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72,
+ 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x00, 0x12, 0x94, 0x04, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f,
+ 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x2a, 0x08,
+ 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x92, 0x41, 0x9e, 0x03, 0x0a, 0x04, 0x67, 0x6f,
+ 0x61, 0x6c, 0x12, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x0e, 0x44, 0x65, 0x6c, 0x65,
+ 0x74, 0x65, 0x20, 0x61, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x2a, 0x12, 0x77, 0x65, 0x62, 0x2e,
+ 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0xb4,
+ 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72,
+ 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61,
+ 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a,
+ 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f,
+ 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20,
+ 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01,
+ 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65,
+ 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61,
+ 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0xad, 0x04, 0x0a, 0x0d, 0x47,
+ 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d,
- 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
- 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e,
- 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10,
- 0x04, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xf8, 0x16,
- 0x0a, 0x11, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76,
- 0x69, 0x63, 0x65, 0x12, 0x82, 0x04, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x12,
- 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74,
- 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x03, 0x82,
- 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x92,
- 0x41, 0x95, 0x03, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x0b,
- 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x2a, 0x0f, 0x77, 0x65, 0x62,
- 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0xb4, 0x01, 0x0a,
- 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65,
- 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65,
- 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61,
- 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12,
- 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69,
- 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b,
- 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f,
- 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
- 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a,
- 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53,
- 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f,
- 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
- 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
- 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c,
- 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x8c, 0x04, 0x0a, 0x09, 0x4c, 0x69, 0x73,
- 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69,
- 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27,
+ 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+ 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e,
+ 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x92, 0x41,
+ 0xa8, 0x03, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x03,
+ 0x47, 0x65, 0x74, 0x1a, 0x12, 0x47, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x2a, 0x15, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e,
+ 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0xb4,
+ 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72,
+ 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61,
+ 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a,
+ 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f,
+ 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20,
+ 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a,
+ 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01,
+ 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65,
+ 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61,
+ 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0xb5, 0x04, 0x0a, 0x0f, 0x4c,
+ 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c,
0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b,
- 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x92, 0x41, 0x98, 0x03, 0x0a,
- 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x0b, 0x4c, 0x69, 0x73,
- 0x74, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x2e, 0x2a, 0x11, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31,
- 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x4a, 0xb4, 0x01, 0x0a, 0x03,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, 0x03, 0x82, 0xd3,
+ 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x92, 0x41, 0xa9, 0x03, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x11, 0x4c, 0x69, 0x73,
+ 0x74, 0x20, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x2a, 0x16,
+ 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac,
+ 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65,
+ 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a,
+ 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f,
+ 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64,
+ 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01,
+ 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61,
+ 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75,
+ 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71,
+ 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
+ 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a,
+ 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31,
+ 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64,
+ 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d,
+ 0x20, 0x7d, 0x12, 0xc2, 0x04, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22,
+ 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x3a,
+ 0x01, 0x2a, 0x92, 0x41, 0xb1, 0x03, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x15, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x2a, 0x18, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0xb4, 0x01, 0x0a, 0x03,
0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64,
0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20,
@@ -2358,128 +2810,54 @@ var file_proto_experiment_service_proto_rawDesc = []byte{
0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,
- 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x97, 0x04, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61,
- 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
- 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61,
- 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x03, 0x82, 0xd3, 0xe4, 0x93,
- 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x61, 0x6c, 0x3a, 0x01, 0x2a, 0x92,
- 0x41, 0x9e, 0x03, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x1a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x67, 0x6f, 0x61, 0x6c,
- 0x2e, 0x2a, 0x12, 0x77, 0x65, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x63,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01,
- 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62,
- 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
- 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64,
- 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14,
- 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74,
- 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64,
- 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
- 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d,
- 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65,
- 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x4a, 0xb2, 0x01, 0x0a,
- 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75,
- 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74,
- 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75,
- 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51,
- 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73,
- 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36,
- 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f,
- 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22,
- 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20,
- 0x7d, 0x12, 0x61, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12,
- 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61,
- 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
- 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x0b, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47,
- 0x6f, 0x61, 0x6c, 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69,
- 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x47, 0x6f, 0x61, 0x6c,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0a, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
- 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47,
- 0x6f, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a,
- 0x0d, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0f, 0x4c, 0x69, 0x73,
- 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
- 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12,
- 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65,
- 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
- 0x12, 0x73, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61,
- 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
- 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78,
- 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
- 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74,
- 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x69, 0x73,
- 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75,
+ 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
+ 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63,
0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0e,
- 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
- 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
- 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e,
- 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x11, 0x41,
- 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
- 0x12, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45,
- 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45,
+ 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x0f,
+ 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12,
+ 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73,
+ 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
+ 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68,
+ 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x45,
0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70,
- 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44,
- 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65,
- 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68,
- 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f,
+ 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65,
+ 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78,
+ 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0x00, 0x12, 0x76, 0x0a, 0x11, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70,
+ 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41,
+ 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41,
+ 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, 0x44, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65,
+ 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,
+ 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x70, 0x65, 0x72,
+ 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -2495,7 +2873,7 @@ func file_proto_experiment_service_proto_rawDescGZIP() []byte {
}
var file_proto_experiment_service_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
-var file_proto_experiment_service_proto_msgTypes = make([]protoimpl.MessageInfo, 30)
+var file_proto_experiment_service_proto_msgTypes = make([]protoimpl.MessageInfo, 31)
var file_proto_experiment_service_proto_goTypes = []interface{}{
(ListGoalsRequest_OrderBy)(0), // 0: bucketeer.experiment.ListGoalsRequest.OrderBy
(ListGoalsRequest_OrderDirection)(0), // 1: bucketeer.experiment.ListGoalsRequest.OrderDirection
@@ -2531,92 +2909,101 @@ var file_proto_experiment_service_proto_goTypes = []interface{}{
(*ArchiveExperimentResponse)(nil), // 31: bucketeer.experiment.ArchiveExperimentResponse
(*DeleteExperimentRequest)(nil), // 32: bucketeer.experiment.DeleteExperimentRequest
(*DeleteExperimentResponse)(nil), // 33: bucketeer.experiment.DeleteExperimentResponse
- (*Goal)(nil), // 34: bucketeer.experiment.Goal
- (*wrapperspb.BoolValue)(nil), // 35: google.protobuf.BoolValue
- (*CreateGoalCommand)(nil), // 36: bucketeer.experiment.CreateGoalCommand
- (*ArchiveGoalCommand)(nil), // 37: bucketeer.experiment.ArchiveGoalCommand
- (*DeleteGoalCommand)(nil), // 38: bucketeer.experiment.DeleteGoalCommand
- (*RenameGoalCommand)(nil), // 39: bucketeer.experiment.RenameGoalCommand
- (*ChangeDescriptionGoalCommand)(nil), // 40: bucketeer.experiment.ChangeDescriptionGoalCommand
- (*Experiment)(nil), // 41: bucketeer.experiment.Experiment
- (*wrapperspb.Int32Value)(nil), // 42: google.protobuf.Int32Value
- (Experiment_Status)(0), // 43: bucketeer.experiment.Experiment.Status
- (*CreateExperimentCommand)(nil), // 44: bucketeer.experiment.CreateExperimentCommand
- (*ChangeExperimentPeriodCommand)(nil), // 45: bucketeer.experiment.ChangeExperimentPeriodCommand
- (*ChangeExperimentNameCommand)(nil), // 46: bucketeer.experiment.ChangeExperimentNameCommand
- (*ChangeExperimentDescriptionCommand)(nil), // 47: bucketeer.experiment.ChangeExperimentDescriptionCommand
- (*StartExperimentCommand)(nil), // 48: bucketeer.experiment.StartExperimentCommand
- (*FinishExperimentCommand)(nil), // 49: bucketeer.experiment.FinishExperimentCommand
- (*StopExperimentCommand)(nil), // 50: bucketeer.experiment.StopExperimentCommand
- (*ArchiveExperimentCommand)(nil), // 51: bucketeer.experiment.ArchiveExperimentCommand
- (*DeleteExperimentCommand)(nil), // 52: bucketeer.experiment.DeleteExperimentCommand
+ (*ListExperimentsResponse_Summary)(nil), // 34: bucketeer.experiment.ListExperimentsResponse.Summary
+ (*Goal)(nil), // 35: bucketeer.experiment.Goal
+ (*wrapperspb.BoolValue)(nil), // 36: google.protobuf.BoolValue
+ (*CreateGoalCommand)(nil), // 37: bucketeer.experiment.CreateGoalCommand
+ (Goal_ConnectionType)(0), // 38: bucketeer.experiment.Goal.ConnectionType
+ (*ArchiveGoalCommand)(nil), // 39: bucketeer.experiment.ArchiveGoalCommand
+ (*DeleteGoalCommand)(nil), // 40: bucketeer.experiment.DeleteGoalCommand
+ (*RenameGoalCommand)(nil), // 41: bucketeer.experiment.RenameGoalCommand
+ (*ChangeDescriptionGoalCommand)(nil), // 42: bucketeer.experiment.ChangeDescriptionGoalCommand
+ (*wrapperspb.StringValue)(nil), // 43: google.protobuf.StringValue
+ (*Experiment)(nil), // 44: bucketeer.experiment.Experiment
+ (*wrapperspb.Int32Value)(nil), // 45: google.protobuf.Int32Value
+ (Experiment_Status)(0), // 46: bucketeer.experiment.Experiment.Status
+ (*CreateExperimentCommand)(nil), // 47: bucketeer.experiment.CreateExperimentCommand
+ (*ChangeExperimentPeriodCommand)(nil), // 48: bucketeer.experiment.ChangeExperimentPeriodCommand
+ (*ChangeExperimentNameCommand)(nil), // 49: bucketeer.experiment.ChangeExperimentNameCommand
+ (*ChangeExperimentDescriptionCommand)(nil), // 50: bucketeer.experiment.ChangeExperimentDescriptionCommand
+ (*StartExperimentCommand)(nil), // 51: bucketeer.experiment.StartExperimentCommand
+ (*FinishExperimentCommand)(nil), // 52: bucketeer.experiment.FinishExperimentCommand
+ (*StopExperimentCommand)(nil), // 53: bucketeer.experiment.StopExperimentCommand
+ (*ArchiveExperimentCommand)(nil), // 54: bucketeer.experiment.ArchiveExperimentCommand
+ (*DeleteExperimentCommand)(nil), // 55: bucketeer.experiment.DeleteExperimentCommand
}
var file_proto_experiment_service_proto_depIdxs = []int32{
- 34, // 0: bucketeer.experiment.GetGoalResponse.goal:type_name -> bucketeer.experiment.Goal
+ 35, // 0: bucketeer.experiment.GetGoalResponse.goal:type_name -> bucketeer.experiment.Goal
0, // 1: bucketeer.experiment.ListGoalsRequest.order_by:type_name -> bucketeer.experiment.ListGoalsRequest.OrderBy
1, // 2: bucketeer.experiment.ListGoalsRequest.order_direction:type_name -> bucketeer.experiment.ListGoalsRequest.OrderDirection
- 35, // 3: bucketeer.experiment.ListGoalsRequest.is_in_use_status:type_name -> google.protobuf.BoolValue
- 35, // 4: bucketeer.experiment.ListGoalsRequest.archived:type_name -> google.protobuf.BoolValue
- 34, // 5: bucketeer.experiment.ListGoalsResponse.goals:type_name -> bucketeer.experiment.Goal
- 36, // 6: bucketeer.experiment.CreateGoalRequest.command:type_name -> bucketeer.experiment.CreateGoalCommand
- 34, // 7: bucketeer.experiment.CreateGoalResponse.goal:type_name -> bucketeer.experiment.Goal
- 37, // 8: bucketeer.experiment.ArchiveGoalRequest.command:type_name -> bucketeer.experiment.ArchiveGoalCommand
- 38, // 9: bucketeer.experiment.DeleteGoalRequest.command:type_name -> bucketeer.experiment.DeleteGoalCommand
- 39, // 10: bucketeer.experiment.UpdateGoalRequest.rename_command:type_name -> bucketeer.experiment.RenameGoalCommand
- 40, // 11: bucketeer.experiment.UpdateGoalRequest.change_description_command:type_name -> bucketeer.experiment.ChangeDescriptionGoalCommand
- 41, // 12: bucketeer.experiment.GetExperimentResponse.experiment:type_name -> bucketeer.experiment.Experiment
- 42, // 13: bucketeer.experiment.ListExperimentsRequest.feature_version:type_name -> google.protobuf.Int32Value
- 42, // 14: bucketeer.experiment.ListExperimentsRequest.status:type_name -> google.protobuf.Int32Value
- 2, // 15: bucketeer.experiment.ListExperimentsRequest.order_by:type_name -> bucketeer.experiment.ListExperimentsRequest.OrderBy
- 3, // 16: bucketeer.experiment.ListExperimentsRequest.order_direction:type_name -> bucketeer.experiment.ListExperimentsRequest.OrderDirection
- 35, // 17: bucketeer.experiment.ListExperimentsRequest.archived:type_name -> google.protobuf.BoolValue
- 43, // 18: bucketeer.experiment.ListExperimentsRequest.statuses:type_name -> bucketeer.experiment.Experiment.Status
- 41, // 19: bucketeer.experiment.ListExperimentsResponse.experiments:type_name -> bucketeer.experiment.Experiment
- 44, // 20: bucketeer.experiment.CreateExperimentRequest.command:type_name -> bucketeer.experiment.CreateExperimentCommand
- 41, // 21: bucketeer.experiment.CreateExperimentResponse.experiment:type_name -> bucketeer.experiment.Experiment
- 45, // 22: bucketeer.experiment.UpdateExperimentRequest.change_experiment_period_command:type_name -> bucketeer.experiment.ChangeExperimentPeriodCommand
- 46, // 23: bucketeer.experiment.UpdateExperimentRequest.change_name_command:type_name -> bucketeer.experiment.ChangeExperimentNameCommand
- 47, // 24: bucketeer.experiment.UpdateExperimentRequest.change_description_command:type_name -> bucketeer.experiment.ChangeExperimentDescriptionCommand
- 48, // 25: bucketeer.experiment.StartExperimentRequest.command:type_name -> bucketeer.experiment.StartExperimentCommand
- 49, // 26: bucketeer.experiment.FinishExperimentRequest.command:type_name -> bucketeer.experiment.FinishExperimentCommand
- 50, // 27: bucketeer.experiment.StopExperimentRequest.command:type_name -> bucketeer.experiment.StopExperimentCommand
- 51, // 28: bucketeer.experiment.ArchiveExperimentRequest.command:type_name -> bucketeer.experiment.ArchiveExperimentCommand
- 52, // 29: bucketeer.experiment.DeleteExperimentRequest.command:type_name -> bucketeer.experiment.DeleteExperimentCommand
- 4, // 30: bucketeer.experiment.ExperimentService.GetGoal:input_type -> bucketeer.experiment.GetGoalRequest
- 6, // 31: bucketeer.experiment.ExperimentService.ListGoals:input_type -> bucketeer.experiment.ListGoalsRequest
- 8, // 32: bucketeer.experiment.ExperimentService.CreateGoal:input_type -> bucketeer.experiment.CreateGoalRequest
- 14, // 33: bucketeer.experiment.ExperimentService.UpdateGoal:input_type -> bucketeer.experiment.UpdateGoalRequest
- 10, // 34: bucketeer.experiment.ExperimentService.ArchiveGoal:input_type -> bucketeer.experiment.ArchiveGoalRequest
- 12, // 35: bucketeer.experiment.ExperimentService.DeleteGoal:input_type -> bucketeer.experiment.DeleteGoalRequest
- 16, // 36: bucketeer.experiment.ExperimentService.GetExperiment:input_type -> bucketeer.experiment.GetExperimentRequest
- 18, // 37: bucketeer.experiment.ExperimentService.ListExperiments:input_type -> bucketeer.experiment.ListExperimentsRequest
- 20, // 38: bucketeer.experiment.ExperimentService.CreateExperiment:input_type -> bucketeer.experiment.CreateExperimentRequest
- 22, // 39: bucketeer.experiment.ExperimentService.UpdateExperiment:input_type -> bucketeer.experiment.UpdateExperimentRequest
- 24, // 40: bucketeer.experiment.ExperimentService.StartExperiment:input_type -> bucketeer.experiment.StartExperimentRequest
- 26, // 41: bucketeer.experiment.ExperimentService.FinishExperiment:input_type -> bucketeer.experiment.FinishExperimentRequest
- 28, // 42: bucketeer.experiment.ExperimentService.StopExperiment:input_type -> bucketeer.experiment.StopExperimentRequest
- 30, // 43: bucketeer.experiment.ExperimentService.ArchiveExperiment:input_type -> bucketeer.experiment.ArchiveExperimentRequest
- 32, // 44: bucketeer.experiment.ExperimentService.DeleteExperiment:input_type -> bucketeer.experiment.DeleteExperimentRequest
- 5, // 45: bucketeer.experiment.ExperimentService.GetGoal:output_type -> bucketeer.experiment.GetGoalResponse
- 7, // 46: bucketeer.experiment.ExperimentService.ListGoals:output_type -> bucketeer.experiment.ListGoalsResponse
- 9, // 47: bucketeer.experiment.ExperimentService.CreateGoal:output_type -> bucketeer.experiment.CreateGoalResponse
- 15, // 48: bucketeer.experiment.ExperimentService.UpdateGoal:output_type -> bucketeer.experiment.UpdateGoalResponse
- 11, // 49: bucketeer.experiment.ExperimentService.ArchiveGoal:output_type -> bucketeer.experiment.ArchiveGoalResponse
- 13, // 50: bucketeer.experiment.ExperimentService.DeleteGoal:output_type -> bucketeer.experiment.DeleteGoalResponse
- 17, // 51: bucketeer.experiment.ExperimentService.GetExperiment:output_type -> bucketeer.experiment.GetExperimentResponse
- 19, // 52: bucketeer.experiment.ExperimentService.ListExperiments:output_type -> bucketeer.experiment.ListExperimentsResponse
- 21, // 53: bucketeer.experiment.ExperimentService.CreateExperiment:output_type -> bucketeer.experiment.CreateExperimentResponse
- 23, // 54: bucketeer.experiment.ExperimentService.UpdateExperiment:output_type -> bucketeer.experiment.UpdateExperimentResponse
- 25, // 55: bucketeer.experiment.ExperimentService.StartExperiment:output_type -> bucketeer.experiment.StartExperimentResponse
- 27, // 56: bucketeer.experiment.ExperimentService.FinishExperiment:output_type -> bucketeer.experiment.FinishExperimentResponse
- 29, // 57: bucketeer.experiment.ExperimentService.StopExperiment:output_type -> bucketeer.experiment.StopExperimentResponse
- 31, // 58: bucketeer.experiment.ExperimentService.ArchiveExperiment:output_type -> bucketeer.experiment.ArchiveExperimentResponse
- 33, // 59: bucketeer.experiment.ExperimentService.DeleteExperiment:output_type -> bucketeer.experiment.DeleteExperimentResponse
- 45, // [45:60] is the sub-list for method output_type
- 30, // [30:45] is the sub-list for method input_type
- 30, // [30:30] is the sub-list for extension type_name
- 30, // [30:30] is the sub-list for extension extendee
- 0, // [0:30] is the sub-list for field type_name
+ 36, // 3: bucketeer.experiment.ListGoalsRequest.is_in_use_status:type_name -> google.protobuf.BoolValue
+ 36, // 4: bucketeer.experiment.ListGoalsRequest.archived:type_name -> google.protobuf.BoolValue
+ 35, // 5: bucketeer.experiment.ListGoalsResponse.goals:type_name -> bucketeer.experiment.Goal
+ 37, // 6: bucketeer.experiment.CreateGoalRequest.command:type_name -> bucketeer.experiment.CreateGoalCommand
+ 38, // 7: bucketeer.experiment.CreateGoalRequest.connection_type:type_name -> bucketeer.experiment.Goal.ConnectionType
+ 35, // 8: bucketeer.experiment.CreateGoalResponse.goal:type_name -> bucketeer.experiment.Goal
+ 39, // 9: bucketeer.experiment.ArchiveGoalRequest.command:type_name -> bucketeer.experiment.ArchiveGoalCommand
+ 40, // 10: bucketeer.experiment.DeleteGoalRequest.command:type_name -> bucketeer.experiment.DeleteGoalCommand
+ 41, // 11: bucketeer.experiment.UpdateGoalRequest.rename_command:type_name -> bucketeer.experiment.RenameGoalCommand
+ 42, // 12: bucketeer.experiment.UpdateGoalRequest.change_description_command:type_name -> bucketeer.experiment.ChangeDescriptionGoalCommand
+ 43, // 13: bucketeer.experiment.UpdateGoalRequest.name:type_name -> google.protobuf.StringValue
+ 43, // 14: bucketeer.experiment.UpdateGoalRequest.description:type_name -> google.protobuf.StringValue
+ 36, // 15: bucketeer.experiment.UpdateGoalRequest.archived:type_name -> google.protobuf.BoolValue
+ 35, // 16: bucketeer.experiment.UpdateGoalResponse.goal:type_name -> bucketeer.experiment.Goal
+ 44, // 17: bucketeer.experiment.GetExperimentResponse.experiment:type_name -> bucketeer.experiment.Experiment
+ 45, // 18: bucketeer.experiment.ListExperimentsRequest.feature_version:type_name -> google.protobuf.Int32Value
+ 45, // 19: bucketeer.experiment.ListExperimentsRequest.status:type_name -> google.protobuf.Int32Value
+ 2, // 20: bucketeer.experiment.ListExperimentsRequest.order_by:type_name -> bucketeer.experiment.ListExperimentsRequest.OrderBy
+ 3, // 21: bucketeer.experiment.ListExperimentsRequest.order_direction:type_name -> bucketeer.experiment.ListExperimentsRequest.OrderDirection
+ 36, // 22: bucketeer.experiment.ListExperimentsRequest.archived:type_name -> google.protobuf.BoolValue
+ 46, // 23: bucketeer.experiment.ListExperimentsRequest.statuses:type_name -> bucketeer.experiment.Experiment.Status
+ 44, // 24: bucketeer.experiment.ListExperimentsResponse.experiments:type_name -> bucketeer.experiment.Experiment
+ 34, // 25: bucketeer.experiment.ListExperimentsResponse.summary:type_name -> bucketeer.experiment.ListExperimentsResponse.Summary
+ 47, // 26: bucketeer.experiment.CreateExperimentRequest.command:type_name -> bucketeer.experiment.CreateExperimentCommand
+ 44, // 27: bucketeer.experiment.CreateExperimentResponse.experiment:type_name -> bucketeer.experiment.Experiment
+ 48, // 28: bucketeer.experiment.UpdateExperimentRequest.change_experiment_period_command:type_name -> bucketeer.experiment.ChangeExperimentPeriodCommand
+ 49, // 29: bucketeer.experiment.UpdateExperimentRequest.change_name_command:type_name -> bucketeer.experiment.ChangeExperimentNameCommand
+ 50, // 30: bucketeer.experiment.UpdateExperimentRequest.change_description_command:type_name -> bucketeer.experiment.ChangeExperimentDescriptionCommand
+ 51, // 31: bucketeer.experiment.StartExperimentRequest.command:type_name -> bucketeer.experiment.StartExperimentCommand
+ 52, // 32: bucketeer.experiment.FinishExperimentRequest.command:type_name -> bucketeer.experiment.FinishExperimentCommand
+ 53, // 33: bucketeer.experiment.StopExperimentRequest.command:type_name -> bucketeer.experiment.StopExperimentCommand
+ 54, // 34: bucketeer.experiment.ArchiveExperimentRequest.command:type_name -> bucketeer.experiment.ArchiveExperimentCommand
+ 55, // 35: bucketeer.experiment.DeleteExperimentRequest.command:type_name -> bucketeer.experiment.DeleteExperimentCommand
+ 4, // 36: bucketeer.experiment.ExperimentService.GetGoal:input_type -> bucketeer.experiment.GetGoalRequest
+ 6, // 37: bucketeer.experiment.ExperimentService.ListGoals:input_type -> bucketeer.experiment.ListGoalsRequest
+ 8, // 38: bucketeer.experiment.ExperimentService.CreateGoal:input_type -> bucketeer.experiment.CreateGoalRequest
+ 14, // 39: bucketeer.experiment.ExperimentService.UpdateGoal:input_type -> bucketeer.experiment.UpdateGoalRequest
+ 10, // 40: bucketeer.experiment.ExperimentService.ArchiveGoal:input_type -> bucketeer.experiment.ArchiveGoalRequest
+ 12, // 41: bucketeer.experiment.ExperimentService.DeleteGoal:input_type -> bucketeer.experiment.DeleteGoalRequest
+ 16, // 42: bucketeer.experiment.ExperimentService.GetExperiment:input_type -> bucketeer.experiment.GetExperimentRequest
+ 18, // 43: bucketeer.experiment.ExperimentService.ListExperiments:input_type -> bucketeer.experiment.ListExperimentsRequest
+ 20, // 44: bucketeer.experiment.ExperimentService.CreateExperiment:input_type -> bucketeer.experiment.CreateExperimentRequest
+ 22, // 45: bucketeer.experiment.ExperimentService.UpdateExperiment:input_type -> bucketeer.experiment.UpdateExperimentRequest
+ 24, // 46: bucketeer.experiment.ExperimentService.StartExperiment:input_type -> bucketeer.experiment.StartExperimentRequest
+ 26, // 47: bucketeer.experiment.ExperimentService.FinishExperiment:input_type -> bucketeer.experiment.FinishExperimentRequest
+ 28, // 48: bucketeer.experiment.ExperimentService.StopExperiment:input_type -> bucketeer.experiment.StopExperimentRequest
+ 30, // 49: bucketeer.experiment.ExperimentService.ArchiveExperiment:input_type -> bucketeer.experiment.ArchiveExperimentRequest
+ 32, // 50: bucketeer.experiment.ExperimentService.DeleteExperiment:input_type -> bucketeer.experiment.DeleteExperimentRequest
+ 5, // 51: bucketeer.experiment.ExperimentService.GetGoal:output_type -> bucketeer.experiment.GetGoalResponse
+ 7, // 52: bucketeer.experiment.ExperimentService.ListGoals:output_type -> bucketeer.experiment.ListGoalsResponse
+ 9, // 53: bucketeer.experiment.ExperimentService.CreateGoal:output_type -> bucketeer.experiment.CreateGoalResponse
+ 15, // 54: bucketeer.experiment.ExperimentService.UpdateGoal:output_type -> bucketeer.experiment.UpdateGoalResponse
+ 11, // 55: bucketeer.experiment.ExperimentService.ArchiveGoal:output_type -> bucketeer.experiment.ArchiveGoalResponse
+ 13, // 56: bucketeer.experiment.ExperimentService.DeleteGoal:output_type -> bucketeer.experiment.DeleteGoalResponse
+ 17, // 57: bucketeer.experiment.ExperimentService.GetExperiment:output_type -> bucketeer.experiment.GetExperimentResponse
+ 19, // 58: bucketeer.experiment.ExperimentService.ListExperiments:output_type -> bucketeer.experiment.ListExperimentsResponse
+ 21, // 59: bucketeer.experiment.ExperimentService.CreateExperiment:output_type -> bucketeer.experiment.CreateExperimentResponse
+ 23, // 60: bucketeer.experiment.ExperimentService.UpdateExperiment:output_type -> bucketeer.experiment.UpdateExperimentResponse
+ 25, // 61: bucketeer.experiment.ExperimentService.StartExperiment:output_type -> bucketeer.experiment.StartExperimentResponse
+ 27, // 62: bucketeer.experiment.ExperimentService.FinishExperiment:output_type -> bucketeer.experiment.FinishExperimentResponse
+ 29, // 63: bucketeer.experiment.ExperimentService.StopExperiment:output_type -> bucketeer.experiment.StopExperimentResponse
+ 31, // 64: bucketeer.experiment.ExperimentService.ArchiveExperiment:output_type -> bucketeer.experiment.ArchiveExperimentResponse
+ 33, // 65: bucketeer.experiment.ExperimentService.DeleteExperiment:output_type -> bucketeer.experiment.DeleteExperimentResponse
+ 51, // [51:66] is the sub-list for method output_type
+ 36, // [36:51] is the sub-list for method input_type
+ 36, // [36:36] is the sub-list for extension type_name
+ 36, // [36:36] is the sub-list for extension extendee
+ 0, // [0:36] is the sub-list for field type_name
}
func init() { file_proto_experiment_service_proto_init() }
@@ -2988,6 +3375,18 @@ func file_proto_experiment_service_proto_init() {
return nil
}
}
+ file_proto_experiment_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListExperimentsResponse_Summary); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -2995,7 +3394,7 @@ func file_proto_experiment_service_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_experiment_service_proto_rawDesc,
NumEnums: 4,
- NumMessages: 30,
+ NumMessages: 31,
NumExtensions: 0,
NumServices: 1,
},
diff --git a/proto/experiment/service.proto b/proto/experiment/service.proto
index d2575b4ef6..a9e668143c 100644
--- a/proto/experiment/service.proto
+++ b/proto/experiment/service.proto
@@ -42,6 +42,7 @@ message ListGoalsRequest {
NAME = 1;
CREATED_AT = 2;
UPDATED_AT = 3;
+ CONNECTION_TYPE = 4;
}
enum OrderDirection {
ASC = 0;
@@ -76,6 +77,7 @@ message CreateGoalRequest {
string id = 4 [(google.api.field_behavior) = REQUIRED];
string name = 5 [(google.api.field_behavior) = REQUIRED];
string description = 6;
+ Goal.ConnectionType connection_type = 7;
}
message CreateGoalResponse {
@@ -92,23 +94,46 @@ message ArchiveGoalRequest {
message ArchiveGoalResponse {}
message DeleteGoalRequest {
- string id = 1;
- DeleteGoalCommand command = 2;
+ string id = 1 [(google.api.field_behavior) = REQUIRED];
+ DeleteGoalCommand command = 2 [
+ deprecated = true,
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "deprecated"
+ }
+ ];
reserved 3;
- string environment_id = 4;
+ string environment_id = 4 [(google.api.field_behavior) = REQUIRED];
}
message DeleteGoalResponse {}
message UpdateGoalRequest {
- string id = 1;
- RenameGoalCommand rename_command = 2;
- ChangeDescriptionGoalCommand change_description_command = 3;
+ string id = 1 [(google.api.field_behavior) = REQUIRED];
+ RenameGoalCommand rename_command = 2 [
+ deprecated = true,
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "deprecated"
+ }
+ ];
+ ChangeDescriptionGoalCommand change_description_command = 3 [
+ deprecated = true,
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "deprecated"
+ }
+ ];
reserved 4;
- string environment_id = 5;
+ string environment_id = 5 [(google.api.field_behavior) = REQUIRED];
+ google.protobuf.StringValue name = 6;
+ google.protobuf.StringValue description = 7;
+ google.protobuf.BoolValue archived = 8
+ [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "if true, the goal will be archived"
+ }];
}
-message UpdateGoalResponse {}
+message UpdateGoalResponse {
+ Goal goal = 1;
+}
message GetExperimentRequest {
string id = 1;
@@ -145,19 +170,37 @@ message ListExperimentsRequest {
string search_keyword = 12;
google.protobuf.BoolValue archived = 13;
repeated Experiment.Status statuses = 14;
- string environment_id = 15;
+ string environment_id = 15 [(google.api.field_behavior) = REQUIRED];
}
message ListExperimentsResponse {
+ message Summary {
+ int64 total_waiting_count = 1;
+ int64 total_running_count = 2;
+ int64 total_stopped_count = 3;
+ }
repeated Experiment experiments = 1;
string cursor = 2;
int64 total_count = 3;
+ Summary summary = 4;
}
message CreateExperimentRequest {
- CreateExperimentCommand command = 1;
+ CreateExperimentCommand command = 1 [
+ deprecated = true,
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "deprecated"
+ }
+ ];
reserved 2;
- string environment_id = 3;
+ string environment_id = 3 [(google.api.field_behavior) = REQUIRED];
+ string feature_id = 4 [(google.api.field_behavior) = REQUIRED];
+ int64 start_at = 5 [(google.api.field_behavior) = REQUIRED];
+ int64 stop_at = 6 [(google.api.field_behavior) = REQUIRED];
+ repeated string goal_ids = 7 [(google.api.field_behavior) = REQUIRED];
+ string name = 8 [(google.api.field_behavior) = REQUIRED];
+ string description = 9;
+ string base_variation_id = 10 [(google.api.field_behavior) = REQUIRED];
}
message CreateExperimentResponse {
@@ -325,15 +368,177 @@ service ExperimentService {
}
};
}
- rpc UpdateGoal(UpdateGoalRequest) returns (UpdateGoalResponse) {}
+ rpc UpdateGoal(UpdateGoalRequest) returns (UpdateGoalResponse) {
+ option (google.api.http) = {
+ patch: "/v1/goal"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Update"
+ description: "Update a goal."
+ tags: "goal"
+ operation_id: "web.v1.goal.update"
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
rpc ArchiveGoal(ArchiveGoalRequest) returns (ArchiveGoalResponse) {}
- rpc DeleteGoal(DeleteGoalRequest) returns (DeleteGoalResponse) {}
+ rpc DeleteGoal(DeleteGoalRequest) returns (DeleteGoalResponse) {
+ option (google.api.http) = {
+ delete: "/v1/goal"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Delete"
+ description: "Delete a goal."
+ tags: "goal"
+ operation_id: "web.v1.goal.delete"
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
- rpc GetExperiment(GetExperimentRequest) returns (GetExperimentResponse) {}
+ rpc GetExperiment(GetExperimentRequest) returns (GetExperimentResponse) {
+ option (google.api.http) = {
+ get: "/v1/experiment"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Get"
+ description: "Get an experiment."
+ tags: "experiment"
+ operation_id: "web.v1.experiment.get"
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
rpc ListExperiments(ListExperimentsRequest)
- returns (ListExperimentsResponse) {}
+ returns (ListExperimentsResponse) {
+ option (google.api.http) = {
+ get: "/v1/experiments"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "List"
+ description: "List experiments."
+ tags: "experiment"
+ operation_id: "web.v1.experiment.list"
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
rpc CreateExperiment(CreateExperimentRequest)
- returns (CreateExperimentResponse) {}
+ returns (CreateExperimentResponse) {
+ option (google.api.http) = {
+ post: "/v1/experiment"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Create"
+ description: "Create an experiment."
+ tags: "experiment"
+ operation_id: "web.v1.experiment.create"
+ responses: {
+ key: "400"
+ value: {
+ description: "Returned for bad requests that may have failed validation."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 3, "message": "invalid arguments error", "details": [] }'
+ }
+ }
+ }
+ responses: {
+ key: "401"
+ value: {
+ description: "Request could not be authenticated (authentication required)."
+ schema: { json_schema: { ref: ".google.rpc.Status" } }
+ examples: {
+ key: "application/json"
+ value: '{ "code": 16, "message": "not authenticated", "details": [] }'
+ }
+ }
+ }
+ };
+ }
rpc UpdateExperiment(UpdateExperimentRequest)
returns (UpdateExperimentResponse) {}
rpc StartExperiment(StartExperimentRequest)
diff --git a/proto/gateway/proto_descriptor.pb b/proto/gateway/proto_descriptor.pb
index ab03819e4a..e985eb2bcd 100644
Binary files a/proto/gateway/proto_descriptor.pb and b/proto/gateway/proto_descriptor.pb differ
diff --git a/proto/gateway/service.pb.go b/proto/gateway/service.pb.go
index 2714f396a2..a96746a929 100644
--- a/proto/gateway/service.pb.go
+++ b/proto/gateway/service.pb.go
@@ -23,6 +23,7 @@ package gateway
import (
context "context"
account "github.com/bucketeer-io/bucketeer/proto/account"
+ coderef "github.com/bucketeer-io/bucketeer/proto/coderef"
client "github.com/bucketeer-io/bucketeer/proto/event/client"
feature "github.com/bucketeer-io/bucketeer/proto/feature"
push "github.com/bucketeer-io/bucketeer/proto/push"
@@ -2796,6 +2797,667 @@ func (x *ListAccountsV2Response) GetTotalCount() int64 {
return 0
}
+type GetCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+}
+
+func (x *GetCodeReferenceRequest) Reset() {
+ *x = GetCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[42]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCodeReferenceRequest) ProtoMessage() {}
+
+func (x *GetCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[42]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*GetCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *GetCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+type GetCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *coderef.CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *GetCodeReferenceResponse) Reset() {
+ *x = GetCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[43]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCodeReferenceResponse) ProtoMessage() {}
+
+func (x *GetCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[43]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*GetCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *GetCodeReferenceResponse) GetCodeReference() *coderef.CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type ListCodeReferencesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ PageSize int64 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+ Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor"`
+ OrderBy coderef.ListCodeReferencesRequest_OrderBy `protobuf:"varint,3,opt,name=order_by,json=orderBy,proto3,enum=bucketeer.coderef.ListCodeReferencesRequest_OrderBy" json:"order_by"`
+ OrderDirection coderef.ListCodeReferencesRequest_OrderDirection `protobuf:"varint,4,opt,name=order_direction,json=orderDirection,proto3,enum=bucketeer.coderef.ListCodeReferencesRequest_OrderDirection" json:"order_direction"`
+ SearchKeyword string `protobuf:"bytes,5,opt,name=search_keyword,json=searchKeyword,proto3" json:"search_keyword"`
+ FeatureId string `protobuf:"bytes,6,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+}
+
+func (x *ListCodeReferencesRequest) Reset() {
+ *x = ListCodeReferencesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[44]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListCodeReferencesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListCodeReferencesRequest) ProtoMessage() {}
+
+func (x *ListCodeReferencesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[44]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListCodeReferencesRequest.ProtoReflect.Descriptor instead.
+func (*ListCodeReferencesRequest) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *ListCodeReferencesRequest) GetPageSize() int64 {
+ if x != nil {
+ return x.PageSize
+ }
+ return 0
+}
+
+func (x *ListCodeReferencesRequest) GetCursor() string {
+ if x != nil {
+ return x.Cursor
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetOrderBy() coderef.ListCodeReferencesRequest_OrderBy {
+ if x != nil {
+ return x.OrderBy
+ }
+ return coderef.ListCodeReferencesRequest_DEFAULT
+}
+
+func (x *ListCodeReferencesRequest) GetOrderDirection() coderef.ListCodeReferencesRequest_OrderDirection {
+ if x != nil {
+ return x.OrderDirection
+ }
+ return coderef.ListCodeReferencesRequest_ASC
+}
+
+func (x *ListCodeReferencesRequest) GetSearchKeyword() string {
+ if x != nil {
+ return x.SearchKeyword
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesRequest) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+type ListCodeReferencesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReferences []*coderef.CodeReference `protobuf:"bytes,1,rep,name=code_references,json=codeReferences,proto3" json:"code_references"`
+ Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor"`
+ TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count"`
+}
+
+func (x *ListCodeReferencesResponse) Reset() {
+ *x = ListCodeReferencesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[45]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListCodeReferencesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListCodeReferencesResponse) ProtoMessage() {}
+
+func (x *ListCodeReferencesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[45]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListCodeReferencesResponse.ProtoReflect.Descriptor instead.
+func (*ListCodeReferencesResponse) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *ListCodeReferencesResponse) GetCodeReferences() []*coderef.CodeReference {
+ if x != nil {
+ return x.CodeReferences
+ }
+ return nil
+}
+
+func (x *ListCodeReferencesResponse) GetCursor() string {
+ if x != nil {
+ return x.Cursor
+ }
+ return ""
+}
+
+func (x *ListCodeReferencesResponse) GetTotalCount() int64 {
+ if x != nil {
+ return x.TotalCount
+ }
+ return 0
+}
+
+type CreateCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ FeatureId string `protobuf:"bytes,1,opt,name=feature_id,json=featureId,proto3" json:"feature_id"`
+ EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ FilePath string `protobuf:"bytes,3,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,5,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,6,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,7,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryName string `protobuf:"bytes,8,opt,name=repository_name,json=repositoryName,proto3" json:"repository_name"`
+ RepositoryOwner string `protobuf:"bytes,9,opt,name=repository_owner,json=repositoryOwner,proto3" json:"repository_owner"`
+ RepositoryType coderef.CodeReference_RepositoryType `protobuf:"varint,10,opt,name=repository_type,json=repositoryType,proto3,enum=bucketeer.coderef.CodeReference_RepositoryType" json:"repository_type"`
+ RepositoryBranch string `protobuf:"bytes,11,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,12,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+}
+
+func (x *CreateCodeReferenceRequest) Reset() {
+ *x = CreateCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[46]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateCodeReferenceRequest) ProtoMessage() {}
+
+func (x *CreateCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[46]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*CreateCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *CreateCodeReferenceRequest) GetFeatureId() string {
+ if x != nil {
+ return x.FeatureId
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *CreateCodeReferenceRequest) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryName() string {
+ if x != nil {
+ return x.RepositoryName
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryOwner() string {
+ if x != nil {
+ return x.RepositoryOwner
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryType() coderef.CodeReference_RepositoryType {
+ if x != nil {
+ return x.RepositoryType
+ }
+ return coderef.CodeReference_REPOSITORY_TYPE_UNSPECIFIED
+}
+
+func (x *CreateCodeReferenceRequest) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *CreateCodeReferenceRequest) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+type CreateCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *coderef.CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *CreateCodeReferenceResponse) Reset() {
+ *x = CreateCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[47]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateCodeReferenceResponse) ProtoMessage() {}
+
+func (x *CreateCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[47]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*CreateCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{47}
+}
+
+func (x *CreateCodeReferenceResponse) GetCodeReference() *coderef.CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type UpdateCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+ FilePath string `protobuf:"bytes,2,opt,name=file_path,json=filePath,proto3" json:"file_path"`
+ LineNumber int32 `protobuf:"varint,3,opt,name=line_number,json=lineNumber,proto3" json:"line_number"`
+ CodeSnippet string `protobuf:"bytes,4,opt,name=code_snippet,json=codeSnippet,proto3" json:"code_snippet"`
+ ContentHash string `protobuf:"bytes,5,opt,name=content_hash,json=contentHash,proto3" json:"content_hash"`
+ Aliases []string `protobuf:"bytes,6,rep,name=aliases,proto3" json:"aliases"`
+ RepositoryBranch string `protobuf:"bytes,7,opt,name=repository_branch,json=repositoryBranch,proto3" json:"repository_branch"`
+ CommitHash string `protobuf:"bytes,8,opt,name=commit_hash,json=commitHash,proto3" json:"commit_hash"`
+}
+
+func (x *UpdateCodeReferenceRequest) Reset() {
+ *x = UpdateCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[48]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UpdateCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateCodeReferenceRequest) ProtoMessage() {}
+
+func (x *UpdateCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[48]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UpdateCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*UpdateCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{48}
+}
+
+func (x *UpdateCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetFilePath() string {
+ if x != nil {
+ return x.FilePath
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetLineNumber() int32 {
+ if x != nil {
+ return x.LineNumber
+ }
+ return 0
+}
+
+func (x *UpdateCodeReferenceRequest) GetCodeSnippet() string {
+ if x != nil {
+ return x.CodeSnippet
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetContentHash() string {
+ if x != nil {
+ return x.ContentHash
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetAliases() []string {
+ if x != nil {
+ return x.Aliases
+ }
+ return nil
+}
+
+func (x *UpdateCodeReferenceRequest) GetRepositoryBranch() string {
+ if x != nil {
+ return x.RepositoryBranch
+ }
+ return ""
+}
+
+func (x *UpdateCodeReferenceRequest) GetCommitHash() string {
+ if x != nil {
+ return x.CommitHash
+ }
+ return ""
+}
+
+type UpdateCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ CodeReference *coderef.CodeReference `protobuf:"bytes,1,opt,name=code_reference,json=codeReference,proto3" json:"code_reference"`
+}
+
+func (x *UpdateCodeReferenceResponse) Reset() {
+ *x = UpdateCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[49]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UpdateCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateCodeReferenceResponse) ProtoMessage() {}
+
+func (x *UpdateCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[49]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UpdateCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*UpdateCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{49}
+}
+
+func (x *UpdateCodeReferenceResponse) GetCodeReference() *coderef.CodeReference {
+ if x != nil {
+ return x.CodeReference
+ }
+ return nil
+}
+
+type DeleteCodeReferenceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+}
+
+func (x *DeleteCodeReferenceRequest) Reset() {
+ *x = DeleteCodeReferenceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[50]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteCodeReferenceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteCodeReferenceRequest) ProtoMessage() {}
+
+func (x *DeleteCodeReferenceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[50]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteCodeReferenceRequest.ProtoReflect.Descriptor instead.
+func (*DeleteCodeReferenceRequest) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *DeleteCodeReferenceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+type DeleteCodeReferenceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteCodeReferenceResponse) Reset() {
+ *x = DeleteCodeReferenceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_gateway_service_proto_msgTypes[51]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteCodeReferenceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteCodeReferenceResponse) ProtoMessage() {}
+
+func (x *DeleteCodeReferenceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_gateway_service_proto_msgTypes[51]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteCodeReferenceResponse.ProtoReflect.Descriptor instead.
+func (*DeleteCodeReferenceResponse) Descriptor() ([]byte, []int) {
+ return file_proto_gateway_service_proto_rawDescGZIP(), []int{51}
+}
+
type GetEvaluationsRequest_UserEvaluationCondition struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -2808,7 +3470,7 @@ type GetEvaluationsRequest_UserEvaluationCondition struct {
func (x *GetEvaluationsRequest_UserEvaluationCondition) Reset() {
*x = GetEvaluationsRequest_UserEvaluationCondition{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_gateway_service_proto_msgTypes[42]
+ mi := &file_proto_gateway_service_proto_msgTypes[52]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2821,7 +3483,7 @@ func (x *GetEvaluationsRequest_UserEvaluationCondition) String() string {
func (*GetEvaluationsRequest_UserEvaluationCondition) ProtoMessage() {}
func (x *GetEvaluationsRequest_UserEvaluationCondition) ProtoReflect() protoreflect.Message {
- mi := &file_proto_gateway_service_proto_msgTypes[42]
+ mi := &file_proto_gateway_service_proto_msgTypes[52]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2863,7 +3525,7 @@ type RegisterEventsResponse_Error struct {
func (x *RegisterEventsResponse_Error) Reset() {
*x = RegisterEventsResponse_Error{}
if protoimpl.UnsafeEnabled {
- mi := &file_proto_gateway_service_proto_msgTypes[43]
+ mi := &file_proto_gateway_service_proto_msgTypes[53]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2876,7 +3538,7 @@ func (x *RegisterEventsResponse_Error) String() string {
func (*RegisterEventsResponse_Error) ProtoMessage() {}
func (x *RegisterEventsResponse_Error) ProtoReflect() protoreflect.Message {
- mi := &file_proto_gateway_service_proto_msgTypes[43]
+ mi := &file_proto_gateway_service_proto_msgTypes[53]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2945,1008 +3607,1234 @@ var file_proto_gateway_service_proto_rawDesc = []byte{
0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61,
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
- 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b,
- 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x0c, 0x50,
- 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74,
- 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22,
- 0xd7, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c,
- 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61,
- 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x10,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46,
- 0x6c, 0x61, 0x67, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75,
- 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63,
- 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08,
- 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f,
- 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73,
- 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x17, 0x47, 0x65,
- 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x49, 0x64, 0x12,
- 0x36, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
- 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x72, 0x63, 0x68, 0x69,
- 0x76, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67,
- 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61, 0x72, 0x63, 0x68,
- 0x69, 0x76, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x49,
- 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f,
- 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x75,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f, 0x72,
- 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74,
- 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
- 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
- 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65,
- 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69,
- 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65,
- 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b,
- 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53,
- 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75,
- 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53,
- 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x0c, 0x73, 0x65, 0x67,
- 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x6c,
- 0x65, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73,
- 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x53,
- 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
- 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c,
- 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
- 0xfa, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x75,
- 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52,
- 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x76,
- 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75,
+ 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2f,
+ 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a,
+ 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x0c,
+ 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04,
+ 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65,
+ 0x22, 0xd7, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46,
+ 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74,
+ 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a,
+ 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x69,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x46, 0x6c, 0x61, 0x67, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+ 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52,
+ 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b,
+ 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+ 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x17, 0x47,
+ 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x49, 0x64,
+ 0x12, 0x36, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
+ 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61,
+ 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61, 0x72, 0x63,
+ 0x68, 0x69, 0x76, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67,
+ 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64,
+ 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f,
+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f,
+ 0x72, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x16, 0x47, 0x65,
+ 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c,
0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x7c, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x5f,
- 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69,
- 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47,
- 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x75, 0x73,
- 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x64,
- 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72,
- 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56,
- 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x74, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76,
- 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
- 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,
- 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74,
- 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69,
- 0x62, 0x75, 0x74, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0xce, 0x01, 0x0a,
- 0x16, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45,
- 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
- 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
- 0x52, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a,
- 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72,
- 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x22, 0xd1, 0x01,
- 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73,
- 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49,
- 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04,
- 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64,
- 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
- 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
- 0x6e, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x76,
- 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65,
- 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x52, 0x65,
- 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x76, 0x65,
- 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64,
- 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x09, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74,
- 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64,
- 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0x94, 0x02, 0x0a, 0x16, 0x52,
- 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
- 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x65, 0x72,
- 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x3f, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1c, 0x0a,
- 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,
- 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6a, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45,
- 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
- 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
- 0x01, 0x22, 0x9c, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73,
- 0x65, 0x72, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
- 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x6f, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x06, 0x67, 0x6f, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61,
- 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09,
- 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
- 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
- 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
- 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0xdd, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
- 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,
- 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x4f, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79,
- 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,
- 0x70, 0x65, 0x52, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70,
- 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
- 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
- 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74,
- 0x61, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52,
- 0x10, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65,
- 0x78, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11,
- 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65,
- 0x78, 0x22, 0x4d, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x66, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64,
+ 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74,
+ 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74,
+ 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x0c, 0x73, 0x65,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
+ 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
+ 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a,
+ 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x22, 0xfa, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61,
+ 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x04,
+ 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72,
+ 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65,
+ 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63,
+ 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x7c, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72,
+ 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x75,
+ 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e,
+ 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x74, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x45,
+ 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x5f,
+ 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61,
+ 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0xce, 0x01,
+ 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72,
+ 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x76, 0x61, 0x6c,
+ 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x52, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e,
+ 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x75, 0x73, 0x65,
+ 0x72, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x22, 0xd1,
+ 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x75, 0x73, 0x65,
+ 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75,
+ 0x73, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
+ 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49,
+ 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65,
+ 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a,
+ 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x52,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x76,
+ 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73,
+ 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x09,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
+ 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x65, 0x76, 0x65, 0x6e,
+ 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49,
+ 0x64, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0x94, 0x02, 0x0a, 0x16,
+ 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
+ 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x3f, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1c,
+ 0x0a, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6a, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+ 0x38, 0x01, 0x22, 0x9c, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x75,
+ 0x73, 0x65, 0x72, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65,
+ 0x72, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x6f, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x6f, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74,
+ 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1c, 0x0a,
+ 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0xdd, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x4f, 0x0a, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+ 0x79, 0x70, 0x65, 0x52, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,
+ 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04,
+ 0x74, 0x61, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05,
+ 0x52, 0x10, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64,
+ 0x65, 0x78, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x11, 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64,
+ 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74,
0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x66,
0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72,
- 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67,
- 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61,
- 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x49,
- 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
- 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79,
- 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x5e, 0x0a, 0x0f, 0x6f, 0x72, 0x64,
- 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66,
- 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72,
- 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72,
- 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x14, 0x4c, 0x69, 0x73,
- 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x12, 0x36, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52,
- 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xa8, 0x05, 0x0a, 0x14, 0x55, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
- 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72,
- 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e,
- 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
- 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12,
- 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61,
- 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
- 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68,
- 0x69, 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f,
- 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64,
- 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08,
- 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45,
- 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18,
- 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71,
- 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69,
- 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
- 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65,
- 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x72, 0x75,
- 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x75,
- 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x64, 0x65, 0x66,
- 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0c, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,
- 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
- 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
- 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a,
- 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68,
- 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67,
- 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61,
- 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x44,
- 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
- 0x32, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73,
- 0x68, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64,
- 0x65, 0x72, 0x42, 0x79, 0x12, 0x59, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69,
- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x4c,
- 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
- 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
- 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72,
- 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b,
- 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75,
- 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06,
- 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75,
- 0x73, 0x68, 0x52, 0x06, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75,
- 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73,
- 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f,
- 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73,
- 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73,
- 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x63, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,
- 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x66,
- 0x63, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x22, 0x3e, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65,
+ 0x65, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61,
+ 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70,
+ 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f,
+ 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12,
+ 0x49, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42,
+ 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x5e, 0x0a, 0x0f, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65,
+ 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65,
+ 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x14, 0x4c, 0x69,
+ 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xa8, 0x05, 0x0a, 0x14, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
+ 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+ 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74,
+ 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x61, 0x72, 0x63,
+ 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f,
+ 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+ 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+ 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+ 0x45, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73,
+ 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x72, 0x65,
+ 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+ 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67,
+ 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52,
+ 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0c,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
+ 0x79, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65,
+ 0x67, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6f, 0x66, 0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x6f, 0x66, 0x66, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34,
+ 0x0a, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x66, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73,
+ 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61,
+ 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70,
+ 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f,
+ 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12,
+ 0x44, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75,
+ 0x73, 0x68, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x59, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e,
+ 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f,
+ 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
+ 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50,
+ 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a,
+ 0x06, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50,
+ 0x75, 0x73, 0x68, 0x52, 0x06, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63,
+ 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72,
+ 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43,
+ 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75,
+ 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67,
+ 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x63, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11,
+ 0x66, 0x63, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x22, 0x3e, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x75, 0x73, 0x68, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x04, 0x70, 0x75, 0x73,
+ 0x68, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x02, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x75, 0x73, 0x68, 0x18, 0x01,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x04, 0x70, 0x75, 0x73, 0x68,
- 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
- 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x75, 0x73, 0x68, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
- 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x04, 0x70, 0x75, 0x73, 0x68, 0x22,
- 0x80, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20,
- 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
- 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
- 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x94, 0x01, 0x0a, 0x07,
- 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x22, 0x80, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x94, 0x01, 0x0a,
+ 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+ 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x2a,
+ 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x32, 0x50, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65,
+ 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+ 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65,
+ 0x74, 0x65, 0x64, 0x22, 0x3e, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73,
+ 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x75, 0x73,
+ 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x04, 0x70,
+ 0x75, 0x73, 0x68, 0x22, 0xa5, 0x03, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14,
+ 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74,
+ 0x61, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55,
+ 0x72, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x11, 0x6f,
+ 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c,
+ 0x65, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f,
+ 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61,
+ 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+ 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+ 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x51, 0x0a, 0x17, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x89,
+ 0x08, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,
+ 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,
+ 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x61, 0x76,
+ 0x61, 0x74, 0x61, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55,
+ 0x72, 0x6c, 0x12, 0x6c, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10,
+ 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65,
+ 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
+ 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x66,
+ 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x66,
+ 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e,
+ 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18,
+ 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a,
+ 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c,
+ 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61,
+ 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x41, 0x76, 0x61, 0x74,
+ 0x61, 0x72, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x64,
+ 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
- 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x2a, 0x07,
- 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x32, 0x50, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65,
- 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66,
- 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
- 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65,
- 0x72, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65,
- 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74,
- 0x65, 0x64, 0x22, 0x3e, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x75, 0x73, 0x68,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x04, 0x70, 0x75,
- 0x73, 0x68, 0x22, 0xa5, 0x03, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a,
- 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d,
- 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x74, 0x61,
- 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72,
- 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61,
- 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x11, 0x6f, 0x72,
- 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18,
- 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x56, 0x32, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72,
- 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03,
- 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32,
- 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65,
- 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c,
- 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
- 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d,
- 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a,
- 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x51, 0x0a, 0x17, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73,
+ 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x68, 0x92, 0x41, 0x65, 0x2a, 0x08,
+ 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x32, 0x59, 0x69, 0x66, 0x20, 0x64, 0x69, 0x73,
+ 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+ 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x66, 0x20,
+ 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x2e, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x8a, 0x01,
+ 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x92, 0x41, 0x51,
+ 0x2a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x32, 0x46, 0x69, 0x66, 0x20, 0x74, 0x72,
+ 0x75, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20,
+ 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+ 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,
+ 0x2e, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x51, 0x0a, 0x17, 0x55, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x89, 0x08,
- 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
- 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69,
- 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x27,
- 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
- 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61,
- 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x61, 0x76, 0x61,
- 0x74, 0x61, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
- 0x65, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72,
- 0x6c, 0x12, 0x6c, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x62,
+ 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x54, 0x0a,
+ 0x13, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6f,
- 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12,
- 0x59, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72,
- 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x69,
- 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
- 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x66, 0x69,
- 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72,
- 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61,
- 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x09,
+ 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x22, 0x61, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+ 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,
+ 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,
+ 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x5d, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a,
+ 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
+ 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+ 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4c,
+ 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+ 0x3b, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xda, 0x04, 0x0a,
+ 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,
+ 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,
+ 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x6f,
+ 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42,
+ 0x79, 0x12, 0x60, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4c,
+ 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65,
+ 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61,
+ 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x69,
+ 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42,
+ 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x12, 0x48, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x0e,
+ 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
- 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09,
- 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
- 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x61,
- 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72,
- 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
- 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x41, 0x76, 0x61, 0x74, 0x61,
- 0x72, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x64, 0x69,
- 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42,
- 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x68, 0x92, 0x41, 0x65, 0x2a, 0x08, 0x64,
- 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x32, 0x59, 0x69, 0x66, 0x20, 0x64, 0x69, 0x73, 0x61,
- 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x68,
- 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
- 0x65, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x66,
- 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
- 0x64, 0x2e, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x8a, 0x01, 0x0a,
- 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
- 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x92, 0x41, 0x51, 0x2a,
- 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x32, 0x46, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75,
- 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x77,
- 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61,
- 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20,
- 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x2e,
- 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x51, 0x0a, 0x17, 0x55, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x13,
- 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67,
- 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61, 0x63,
- 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e,
- 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x22, 0x61, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49,
- 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69,
- 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x25,
- 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
- 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x5d, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
- 0x6e, 0x74, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07,
- 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x07, 0x61, 0x63, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f,
- 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4c, 0x0a,
- 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b,
- 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xda, 0x04, 0x0a, 0x15,
- 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65,
+ 0x75, 0x65, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49,
+ 0x64, 0x12, 0x46, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e,
+ 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4c, 0x69,
+ 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73,
+ 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x56, 0x32, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x16,
+ 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+ 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74,
+ 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f,
+ 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x22, 0x63, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47,
+ 0x0a, 0x0e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69,
0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69,
0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72,
- 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63,
- 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
- 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79,
- 0x12, 0x60, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
- 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x4c, 0x69,
- 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
- 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79,
- 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72,
- 0x63, 0x68, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x69, 0x73,
- 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f,
- 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
- 0x64, 0x12, 0x48, 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49,
- 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x0e, 0x65,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
- 0x65, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
- 0x12, 0x46, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
- 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74,
- 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
- 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73,
- 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x56, 0x32, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a,
- 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63,
- 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61,
- 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xeb, 0x37, 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77,
- 0x61, 0x79, 0x12, 0xf4, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61,
- 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
- 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65,
+ 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x08, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66,
+ 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72,
+ 0x42, 0x79, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x64, 0x0a, 0x0f, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64,
+ 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63,
+ 0x68, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74,
+ 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65,
+ 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74,
+ 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+ 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xfc, 0x03, 0x0a, 0x1a, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12,
+ 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b,
+ 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a,
+ 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x05, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74,
+ 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48,
+ 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x07,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a,
+ 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x77, 0x6e, 0x65,
+ 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43,
+ 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72,
+ 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68,
+ 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x66, 0x0a, 0x1b, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6f, 0x64, 0x65,
+ 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x64,
+ 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x22, 0x98, 0x02, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a,
+ 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21,
+ 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65,
+ 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73,
+ 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18,
+ 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2b,
+ 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61,
+ 0x6e, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x66, 0x0a, 0x1b,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63,
+ 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x63, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f,
+ 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x32, 0x99, 0x46, 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0xf4, 0x02,
+ 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47,
+ 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10,
+ 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xed, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12,
+ 0x0f, 0x47, 0x65, 0x74, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x1a, 0x61, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x20,
+ 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49,
+ 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x43, 0x4c,
+ 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x2e, 0x2a, 0x1b, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
+ 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79,
+ 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e,
+ 0x18, 0x01, 0x28, 0x01, 0x12, 0xee, 0x02, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c,
+ 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76,
+ 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x02, 0x82, 0xd3, 0xe4,
- 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xed, 0x01, 0x0a, 0x16, 0x43, 0x6c,
- 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
- 0x53, 0x44, 0x4b, 0x73, 0x12, 0x0f, 0x47, 0x65, 0x74, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x61, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20,
- 0x74, 0x68, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
- 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x75,
- 0x73, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69,
+ 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, 0x02, 0x82, 0xd3, 0xe4, 0x93,
+ 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xeb, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44,
+ 0x4b, 0x73, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x1a, 0x61, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c,
+ 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x75, 0x73, 0x65, 0x72,
+ 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41,
+ 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60,
+ 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77,
+ 0x61, 0x79, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65,
+ 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65,
+ 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xfa, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65,
+ 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0x8f, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x67, 0x65, 0x74, 0x5f,
+ 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x01, 0x2a,
+ 0x92, 0x41, 0xee, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x11, 0x47, 0x65,
+ 0x74, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x1a,
+ 0x5e, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e,
+ 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f,
+ 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20,
+ 0x69, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x60, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52,
+ 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a,
+ 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x65, 0x74,
+ 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x72, 0x42,
+ 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01,
+ 0x28, 0x01, 0x12, 0xfb, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61,
+ 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
+ 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x02,
+ 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x67,
+ 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xef,
+ 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65,
+ 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x11, 0x47, 0x65, 0x74, 0x20, 0x53,
+ 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x55, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x5f, 0x47, 0x65,
+ 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x69, 0x74,
+ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x60, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x60, 0x20,
+ 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61,
+ 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x73,
+ 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x72, 0x42, 0x0a, 0x40,
+ 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64,
+ 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01,
+ 0x12, 0xf9, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+ 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+ 0x15, 0x22, 0x10, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65,
+ 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xf2, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44,
+ 0x4b, 0x73, 0x12, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x45, 0x76, 0x65,
+ 0x6e, 0x74, 0x73, 0x1a, 0x66, 0x54, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x73,
+ 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x47,
+ 0x6f, 0x61, 0x6c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x69, 0x74,
+ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x60, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54,
+ 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x60, 0x20, 0x41, 0x50,
+ 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1b, 0x61, 0x70, 0x69,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
+ 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75,
+ 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65,
+ 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20,
+ 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0x8f, 0x02, 0x0a,
+ 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x63,
+ 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x01, 0x82, 0xd3, 0xe4, 0x93,
+ 0x02, 0x08, 0x12, 0x06, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x92, 0x41, 0xb0, 0x01, 0x0a, 0x16,
+ 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65,
+ 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x1a, 0x7c, 0x54,
+ 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x47, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x61, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72,
+ 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x47, 0x6f, 0x61, 0x6c, 0x20,
+ 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65,
+ 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x41, 0x50,
+ 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x11, 0x61, 0x70, 0x69,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x12, 0xd5,
+ 0x02, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75,
+ 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x76,
+ 0x31, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xd5,
+ 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73,
+ 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x58, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46,
+ 0x6c, 0x61, 0x67, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69,
0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20,
- 0x61, 0x20, 0x60, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
- 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1b, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61,
- 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f,
+ 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44,
+ 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x2a, 0x1e, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xb5, 0x02, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0xd9, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31,
+ 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92, 0x41,
+ 0xbc, 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67,
+ 0x73, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x45, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x46, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f,
+ 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20,
+ 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1b, 0x61,
+ 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x66, 0x65,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d,
+ 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54,
+ 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69,
+ 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xb8,
+ 0x02, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12,
+ 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65,
+ 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+ 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0xd6, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x92, 0x41, 0xbe, 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74,
+ 0x1a, 0x45, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46,
+ 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65,
+ 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1c, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73,
+ 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f,
0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50,
0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20,
0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e,
- 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xee, 0x02, 0x0a, 0x0d, 0x47, 0x65,
- 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x62, 0x75,
+ 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xd6, 0x02, 0x0a, 0x0d, 0x55, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c,
- 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89,
- 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76,
- 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xeb, 0x01, 0x0a,
- 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76,
- 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x45, 0x76, 0x61,
- 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x61, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x20,
- 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
- 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74,
- 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65,
- 0x64, 0x20, 0x61, 0x20, 0x60, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x41, 0x50, 0x49,
- 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a, 0x61, 0x70, 0x69, 0x2e,
- 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x76, 0x61, 0x6c,
- 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68,
- 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41,
- 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
- 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f,
- 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xfa, 0x02, 0x0a, 0x0f, 0x47,
- 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x29,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77,
- 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61,
- 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65,
- 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12,
- 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61,
- 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xee, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e,
- 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b,
- 0x73, 0x12, 0x11, 0x47, 0x65, 0x74, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46,
- 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x5e, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74,
- 0x68, 0x65, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20,
- 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e,
- 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
- 0x41, 0x50, 0x49, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x60, 0x53,
- 0x45, 0x52, 0x56, 0x45, 0x52, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72,
- 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c,
- 0x61, 0x67, 0x73, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
- 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20,
- 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e,
- 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f,
- 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xfb, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53,
- 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
- 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65,
- 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0x90, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x67, 0x65,
- 0x74, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3a,
- 0x01, 0x2a, 0x92, 0x41, 0xef, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61,
- 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x11,
- 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x55, 0x73, 0x65, 0x72,
- 0x73, 0x1a, 0x5f, 0x47, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20,
- 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e,
- 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
- 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50,
- 0x49, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x60, 0x53, 0x45, 0x52,
- 0x56, 0x45, 0x52, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c,
- 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72,
- 0x73, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65,
- 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74,
- 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65,
- 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xf9, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
- 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67,
- 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67,
- 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45,
- 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x02,
- 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
- 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xf2, 0x01, 0x0a,
- 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76,
- 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
- 0x72, 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x66, 0x54, 0x68, 0x69, 0x73, 0x20, 0x41,
- 0x50, 0x49, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74,
- 0x69, 0x6e, 0x67, 0x20, 0x47, 0x6f, 0x61, 0x6c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf1,
+ 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x32, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xd1,
+ 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73,
+ 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x54, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x20, 0x61, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2e,
0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50,
- 0x49, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x60, 0x43,
- 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x53, 0x45, 0x52, 0x56, 0x45,
- 0x52, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e,
- 0x2a, 0x1b, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x72, 0x65,
- 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x72, 0x42, 0x0a,
- 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41,
- 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28,
- 0x01, 0x12, 0x8f, 0x02, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x2e, 0x62, 0x75,
+ 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57,
+ 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60,
+ 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1e,
+ 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x42,
+ 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01,
+ 0x28, 0x01, 0x12, 0xee, 0x01, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x62, 0x75,
0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
- 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2,
- 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x92,
- 0x41, 0xb0, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20,
- 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x44, 0x4b, 0x73, 0x12, 0x05, 0x54, 0x72, 0x61,
- 0x63, 0x6b, 0x1a, 0x7c, 0x54, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x73, 0x20,
- 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
- 0x6f, 0x72, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x61, 0x62, 0x20, 0x4d, 0x61,
- 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20,
- 0x47, 0x6f, 0x61, 0x6c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20,
- 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79,
- 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x43, 0x4c, 0x49, 0x45, 0x4e,
- 0x54, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e,
- 0x2a, 0x11, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x74, 0x72,
- 0x61, 0x63, 0x6b, 0x12, 0xd5, 0x02, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65,
- 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa4, 0x01, 0x82,
+ 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x70, 0x69, 0x6e, 0x67, 0x92, 0x41, 0x93, 0x01,
+ 0x0a, 0x07, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x1a,
+ 0x2a, 0x50, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x76,
+ 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x2a, 0x10, 0x61, 0x70, 0x69,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x69, 0x6e, 0x67, 0x62, 0x00, 0x72,
+ 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18,
+ 0x01, 0x28, 0x01, 0x12, 0xa0, 0x02, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68,
+ 0x65, 0x73, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67,
+ 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65,
+ 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73,
+ 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0xc4, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x75,
+ 0x73, 0x68, 0x65, 0x73, 0x92, 0x41, 0xae, 0x01, 0x0a, 0x06, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73,
+ 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3e, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x70, 0x75, 0x73,
+ 0x68, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20,
+ 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65,
+ 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x6c, 0x69,
+ 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xf3, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77,
- 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02,
- 0x11, 0x22, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3a,
- 0x01, 0x2a, 0x92, 0x41, 0xd5, 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20,
- 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x58, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c,
- 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20,
- 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f,
- 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65,
- 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1e, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73,
- 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74,
- 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20,
- 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
- 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43,
- 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xb5, 0x02, 0x0a, 0x0a,
- 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47,
- 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd9, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13,
- 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b,
- 0x69, 0x64, 0x7d, 0x92, 0x41, 0xbc, 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x45, 0x47, 0x65, 0x74,
- 0x20, 0x61, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2e,
- 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50,
- 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52,
- 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c,
- 0x65, 0x2e, 0x2a, 0x1b, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x72,
+ 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x97, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x76, 0x31,
+ 0x2f, 0x70, 0x75, 0x73, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x80, 0x02, 0x0a, 0x06, 0x50, 0x75,
+ 0x73, 0x68, 0x65, 0x73, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x8b, 0x01, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x50, 0x75, 0x73, 0x68,
+ 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68,
+ 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x46, 0x69, 0x72,
+ 0x65, 0x62, 0x61, 0x73, 0x65, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x46, 0x43, 0x4d, 0x29, 0x2e, 0x20, 0x54, 0x6f, 0x20,
+ 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79,
+ 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45,
+ 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49,
+ 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1c, 0x61, 0x70, 0x69, 0x2e,
+ 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65,
+ 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75,
+ 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65,
+ 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20,
+ 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xa4, 0x02, 0x0a,
+ 0x07, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x12, 0x21, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74,
+ 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0xd1, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x75,
+ 0x73, 0x68, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xb8, 0x01, 0x0a, 0x06, 0x50, 0x75, 0x73,
+ 0x68, 0x65, 0x73, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x4a, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20,
+ 0x50, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20,
+ 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x19, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x72,
0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18,
- 0x01, 0x28, 0x01, 0x12, 0xb8, 0x02, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
- 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c,
- 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x92, 0x41, 0xbe, 0x01,
- 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12,
- 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x45, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x46, 0x65, 0x61, 0x74,
- 0x75, 0x72, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61,
- 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75,
- 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41,
- 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1c, 0x61, 0x70,
- 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61,
- 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d,
- 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54,
- 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69,
- 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xd6,
- 0x02, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
- 0x12, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75,
- 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x22, 0xf1, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x32, 0x11, 0x2f, 0x76,
- 0x31, 0x2f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a,
- 0x01, 0x2a, 0x92, 0x41, 0xd1, 0x01, 0x0a, 0x0d, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20,
- 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x54, 0x55,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20,
- 0x46, 0x6c, 0x61, 0x67, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68,
- 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64,
- 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41,
- 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f,
- 0x6c, 0x65, 0x2e, 0x2a, 0x1e, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
- 0x2e, 0x76, 0x31, 0x2e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x70, 0x64,
+ 0x01, 0x28, 0x01, 0x12, 0xc0, 0x02, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75,
+ 0x73, 0x68, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67,
+ 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73,
+ 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0xe4, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x32, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x75,
+ 0x73, 0x68, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xc8, 0x01, 0x0a, 0x06,
+ 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x54,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x50, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f,
+ 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f,
+ 0x75, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60,
+ 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1c, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xce, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x12, 0x29, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
+ 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0xe3, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x76, 0x31, 0x2f,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xc9, 0x01, 0x0a, 0x07,
+ 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a,
+ 0x53, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65,
+ 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60,
+ 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65,
0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20,
0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e,
0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f,
- 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xee, 0x01, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67,
- 0x12, 0x1e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0xa4, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x70, 0x69, 0x6e,
- 0x67, 0x92, 0x41, 0x93, 0x01, 0x0a, 0x07, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x04,
- 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x2a, 0x50, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
- 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69,
- 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e,
- 0x2a, 0x10, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x69,
- 0x6e, 0x67, 0x62, 0x00, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49,
- 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f,
- 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73,
- 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xa0, 0x02, 0x0a, 0x0a, 0x4c, 0x69, 0x73,
- 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74,
- 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f,
- 0x76, 0x31, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x92, 0x41, 0xae, 0x01, 0x0a, 0x06, 0x50,
- 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3e, 0x4c, 0x69, 0x73,
- 0x74, 0x20, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c,
- 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20,
- 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50,
- 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a, 0x61, 0x70, 0x69,
- 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68,
- 0x65, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74,
- 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20,
- 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
- 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43,
- 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xf3, 0x02, 0x0a, 0x0a,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x25, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x97, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d,
- 0x22, 0x08, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x80,
- 0x02, 0x0a, 0x06, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x1a, 0x8b, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77,
- 0x20, 0x50, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x20, 0x46, 0x69, 0x72, 0x65, 0x62, 0x61, 0x73, 0x65, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64,
- 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x46, 0x43, 0x4d, 0x29,
- 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41,
- 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60,
- 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e,
- 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a,
- 0x1c, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e,
- 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a,
- 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41,
- 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28,
- 0x01, 0x12, 0xa4, 0x02, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x12, 0x21, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x22, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd1, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f,
- 0x76, 0x31, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xb8, 0x01,
- 0x0a, 0x06, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x4a, 0x47,
- 0x65, 0x74, 0x20, 0x61, 0x20, 0x50, 0x75, 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69,
- 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20,
+ 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xe5, 0x02, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x12, 0x29, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0xfa, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x32, 0x25, 0x2f, 0x76, 0x31,
+ 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69,
+ 0x6c, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xc6, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x50, 0x55, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54,
+ 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c,
+ 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49,
+ 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41,
+ 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70,
+ 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a,
+ 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b,
+ 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d,
+ 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12,
+ 0xd7, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32,
+ 0x12, 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74,
+ 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0xf5, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x31, 0x2f,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x7d, 0x92, 0x41, 0xc4, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16,
+ 0x47, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x1a, 0x41, 0x47, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x41,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20,
0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65,
0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20,
- 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x19, 0x61, 0x70, 0x69, 0x2e, 0x67,
- 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73,
- 0x2e, 0x67, 0x65, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49,
- 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f,
- 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73,
- 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xc0, 0x02, 0x0a, 0x0a, 0x55, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x24, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61,
- 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe4, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x32, 0x0d, 0x2f,
- 0x76, 0x31, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92,
- 0x41, 0xc8, 0x01, 0x0a, 0x06, 0x50, 0x75, 0x73, 0x68, 0x65, 0x73, 0x12, 0x06, 0x55, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x1a, 0x54, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x50, 0x75,
- 0x73, 0x68, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
- 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50,
- 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60,
- 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20,
- 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1c, 0x61, 0x70, 0x69, 0x2e, 0x67,
- 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73,
- 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74,
- 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20,
- 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
- 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43,
- 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xce, 0x02, 0x0a, 0x0f,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x12,
- 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65,
- 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe3, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22,
- 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92,
- 0x41, 0xc9, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x06, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x1a, 0x53, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e,
- 0x65, 0x77, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63,
- 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f,
- 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60,
- 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20,
- 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67,
+ 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a, 0x61, 0x70, 0x69, 0x2e, 0x67,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
- 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75,
- 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65,
- 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20,
- 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xe5, 0x02, 0x0a,
- 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32,
- 0x12, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
- 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
- 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfa, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a,
- 0x32, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x6f,
- 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
- 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xc6, 0x01, 0x0a, 0x07,
- 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a,
- 0x50, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75,
- 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73,
- 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61,
- 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d,
- 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65,
- 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76,
- 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79,
- 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
- 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e,
- 0x18, 0x01, 0x28, 0x01, 0x12, 0xd7, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf5, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12,
- 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x6f, 0x72,
- 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b,
- 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x92, 0x41, 0xc4, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x12, 0x16, 0x47, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x4f, 0x72, 0x67, 0x61,
- 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x1a, 0x41, 0x47, 0x65, 0x74,
- 0x20, 0x61, 0x6e, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20,
+ 0x74, 0x2e, 0x67, 0x65, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50,
+ 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e,
+ 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xc1, 0x03, 0x0a, 0x1b, 0x47, 0x65,
+ 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x35, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65,
+ 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69,
+ 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x36, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56,
+ 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+ 0x41, 0x12, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x67,
+ 0x65, 0x74, 0x2d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x65, 0x6e,
+ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x65, 0x6d, 0x61, 0x69,
+ 0x6c, 0x7d, 0x92, 0x41, 0xe7, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+ 0x15, 0x47, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x1a, 0x53, 0x47, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x41,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c,
+ 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20,
+ 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50,
+ 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x2c, 0x61, 0x70, 0x69,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72,
+ 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61,
+ 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68,
+ 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e,
+ 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xc6, 0x02,
+ 0x0a, 0x05, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x12, 0x1f, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d,
+ 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74,
+ 0x4d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf9, 0x01, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x2f, 0x6d, 0x65, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xcd, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x12, 0x13, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20,
+ 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x4a, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41,
+ 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60,
+ 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
+ 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x5f,
+ 0x6d, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xb6, 0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x12, 0x28, 0x2e, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69,
+ 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e,
+ 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce,
+ 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x92, 0x41, 0xb6, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x44, 0x47, 0x65, 0x74, 0x20, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x20,
0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79,
0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60,
- 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1a,
+ 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1b,
0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61,
- 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d,
- 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54,
- 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69,
- 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xc1,
- 0x03, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42,
- 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x35,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77,
- 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42,
- 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65,
- 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x32, 0x42, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
- 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x02,
- 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f,
- 0x75, 0x6e, 0x74, 0x2f, 0x67, 0x65, 0x74, 0x2d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2d,
- 0x62, 0x79, 0x2d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b,
- 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
- 0x7b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x7d, 0x92, 0x41, 0xe7, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x15, 0x47, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x45, 0x6e, 0x76,
- 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x1a, 0x53, 0x47, 0x65, 0x74,
- 0x20, 0x61, 0x6e, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x45,
- 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x2e, 0x20, 0x54,
- 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c,
- 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41,
- 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e,
- 0x2a, 0x2c, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31,
- 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x5f,
- 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x72, 0x42,
- 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
- 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01,
- 0x28, 0x01, 0x12, 0xc6, 0x02, 0x0a, 0x05, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x12, 0x1f, 0x2e, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
- 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
- 0xf9, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63,
- 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6d, 0x65, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
- 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xcd, 0x01, 0x0a, 0x07,
- 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x13, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x72,
- 0x76, 0x69, 0x63, 0x65, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x4a, 0x47, 0x65,
- 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x63,
- 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74,
- 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65,
- 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
- 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x1d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61,
- 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
- 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74,
+ 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a,
+ 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b,
+ 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d,
+ 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12,
+ 0xd9, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x2b, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01,
+ 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d,
+ 0x92, 0x41, 0xc7, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x03, 0x47, 0x65, 0x74, 0x1a, 0x47, 0x47, 0x65, 0x74, 0x20,
+ 0x61, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41,
+ 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60,
+ 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x2e, 0x2a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
+ 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74,
0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20,
0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43,
- 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xb6, 0x02, 0x0a, 0x0e,
- 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x12, 0x28,
+ 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xdc, 0x02, 0x0a, 0x12,
+ 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67,
+ 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74,
+ 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0xe8, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x92, 0x41, 0xc9,
+ 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63,
+ 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x20,
+ 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49,
+ 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x52, 0x45,
+ 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x2e, 0x2a, 0x23, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76,
+ 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68,
+ 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41,
+ 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f,
+ 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xf9, 0x02, 0x0a, 0x13, 0x43,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67,
+ 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64,
+ 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61,
+ 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x82, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3a,
+ 0x01, 0x2a, 0x92, 0x41, 0xe0, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a,
+ 0x5a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6f,
+ 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f,
+ 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20,
+ 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54,
+ 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50,
+ 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x25, 0x61, 0x70, 0x69,
+ 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65,
+ 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x12, 0xfa, 0x02, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d,
0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77,
- 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56,
- 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73,
- 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x22, 0xce, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76,
- 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x92, 0x41, 0xb6, 0x01, 0x0a, 0x07,
- 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x44, 0x47,
- 0x65, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73,
- 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41,
- 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60,
- 0x52, 0x45, 0x41, 0x44, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f,
- 0x6c, 0x65, 0x2e, 0x2a, 0x1b, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
- 0x2e, 0x76, 0x31, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x6c, 0x69, 0x73, 0x74,
- 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79,
- 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
- 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e,
- 0x18, 0x01, 0x28, 0x01, 0x42, 0x84, 0x06, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f,
- 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x92, 0x41, 0xcf, 0x05, 0x12, 0x20, 0x0a, 0x19,
- 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
- 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x08,
- 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70,
- 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61,
- 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52,
- 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30, 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75,
- 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68,
- 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56,
- 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73,
- 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c,
- 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76,
- 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65,
- 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22,
- 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x52, 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa,
- 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64,
- 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
- 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e,
- 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
- 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c,
- 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20,
- 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68,
- 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74,
- 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x52, 0xa9, 0x01, 0x0a, 0x03,
- 0x34, 0x30, 0x33, 0x12, 0xa1, 0x01, 0x0a, 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20,
- 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65,
- 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65,
- 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,
- 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
- 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c,
- 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20,
- 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73,
- 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f,
- 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,
- 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x5a, 0x50, 0x0a, 0x4e, 0x0a, 0x0a, 0x41, 0x70, 0x69,
- 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x40, 0x08, 0x02, 0x12, 0x2b, 0x54, 0x68, 0x65,
- 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20,
- 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x1a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
- 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41,
- 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x33,
+ 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x02,
+ 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x32, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d,
+ 0x3a, 0x01, 0x2a, 0x92, 0x41, 0xdc, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x1a, 0x56, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61,
+ 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75,
+ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20,
+ 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b,
+ 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x2a, 0x25, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61,
+ 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x72,
+ 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18,
+ 0x01, 0x28, 0x01, 0x12, 0xf7, 0x02, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f,
+ 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44,
+ 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x02, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x92, 0x41, 0xdc,
+ 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x12, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x56, 0x44, 0x65, 0x6c, 0x65,
+ 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20,
+ 0x61, 0x20, 0x60, 0x57, 0x52, 0x49, 0x54, 0x45, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x41, 0x44,
+ 0x4d, 0x49, 0x4e, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x2e, 0x2a, 0x25, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e,
+ 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x40, 0x0a, 0x0d, 0x61,
+ 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x54, 0x68,
+ 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e,
+ 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x18, 0x01, 0x28, 0x01, 0x42, 0x84, 0x06,
+ 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
+ 0x79, 0x92, 0x41, 0xcf, 0x05, 0x12, 0x20, 0x0a, 0x19, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65,
+ 0x65, 0x72, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x08, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e,
+ 0x54, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0xb4, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x30,
+ 0x12, 0xac, 0x01, 0x0a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x62, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69,
+ 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x12,
+ 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
+ 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x42, 0x7b, 0x20, 0x22,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72,
+ 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20,
+ 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x52,
+ 0xb2, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0xaa, 0x01, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28,
+ 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x22, 0x51, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x3d, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a,
+ 0x20, 0x31, 0x36, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20,
+ 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
+ 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20,
+ 0x5b, 0x5d, 0x20, 0x7d, 0x52, 0xa9, 0x01, 0x0a, 0x03, 0x34, 0x30, 0x33, 0x12, 0xa1, 0x01, 0x0a,
+ 0x38, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
+ 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x7b, 0x20, 0x22, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a,
+ 0x20, 0x37, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22,
+ 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2c,
+ 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x20, 0x7d,
+ 0x5a, 0x50, 0x0a, 0x4e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68,
+ 0x12, 0x40, 0x08, 0x02, 0x12, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x4b, 0x65,
+ 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65,
+ 0x2e, 0x1a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75,
+ 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -3961,7 +4849,7 @@ func file_proto_gateway_service_proto_rawDescGZIP() []byte {
return file_proto_gateway_service_proto_rawDescData
}
-var file_proto_gateway_service_proto_msgTypes = make([]protoimpl.MessageInfo, 45)
+var file_proto_gateway_service_proto_msgTypes = make([]protoimpl.MessageInfo, 55)
var file_proto_gateway_service_proto_goTypes = []interface{}{
(*PingRequest)(nil), // 0: bucketeer.gateway.PingRequest
(*PingResponse)(nil), // 1: bucketeer.gateway.PingResponse
@@ -4005,156 +4893,187 @@ var file_proto_gateway_service_proto_goTypes = []interface{}{
(*GetMeResponse)(nil), // 39: bucketeer.gateway.GetMeResponse
(*ListAccountsV2Request)(nil), // 40: bucketeer.gateway.ListAccountsV2Request
(*ListAccountsV2Response)(nil), // 41: bucketeer.gateway.ListAccountsV2Response
- (*GetEvaluationsRequest_UserEvaluationCondition)(nil), // 42: bucketeer.gateway.GetEvaluationsRequest.UserEvaluationCondition
- (*RegisterEventsResponse_Error)(nil), // 43: bucketeer.gateway.RegisterEventsResponse.Error
- nil, // 44: bucketeer.gateway.RegisterEventsResponse.ErrorsEntry
- (client.SourceId)(0), // 45: bucketeer.event.client.SourceId
- (*feature.Feature)(nil), // 46: bucketeer.feature.Feature
- (*feature.SegmentUsers)(nil), // 47: bucketeer.feature.SegmentUsers
- (*user.User)(nil), // 48: bucketeer.user.User
- (feature.UserEvaluations_State)(0), // 49: bucketeer.feature.UserEvaluations.State
- (*feature.UserEvaluations)(nil), // 50: bucketeer.feature.UserEvaluations
- (*feature.Evaluation)(nil), // 51: bucketeer.feature.Evaluation
- (*client.Event)(nil), // 52: bucketeer.event.client.Event
- (feature.Feature_VariationType)(0), // 53: bucketeer.feature.Feature.VariationType
- (*feature.Variation)(nil), // 54: bucketeer.feature.Variation
- (feature.ListFeaturesRequest_OrderBy)(0), // 55: bucketeer.feature.ListFeaturesRequest.OrderBy
- (feature.ListFeaturesRequest_OrderDirection)(0), // 56: bucketeer.feature.ListFeaturesRequest.OrderDirection
- (*wrapperspb.StringValue)(nil), // 57: google.protobuf.StringValue
- (*wrapperspb.BoolValue)(nil), // 58: google.protobuf.BoolValue
- (*feature.Prerequisite)(nil), // 59: bucketeer.feature.Prerequisite
- (*feature.Target)(nil), // 60: bucketeer.feature.Target
- (*feature.Rule)(nil), // 61: bucketeer.feature.Rule
- (*feature.Strategy)(nil), // 62: bucketeer.feature.Strategy
- (push.ListPushesRequest_OrderBy)(0), // 63: bucketeer.push.ListPushesRequest.OrderBy
- (push.ListPushesRequest_OrderDirection)(0), // 64: bucketeer.push.ListPushesRequest.OrderDirection
- (*push.Push)(nil), // 65: bucketeer.push.Push
- (account.AccountV2_Role_Organization)(0), // 66: bucketeer.account.AccountV2.Role.Organization
- (*account.AccountV2_EnvironmentRole)(nil), // 67: bucketeer.account.AccountV2.EnvironmentRole
- (*account.AccountV2)(nil), // 68: bucketeer.account.AccountV2
- (*account.UpdateAccountV2Request_OrganizationRoleValue)(nil), // 69: bucketeer.account.UpdateAccountV2Request.OrganizationRoleValue
- (*wrapperspb.Int64Value)(nil), // 70: google.protobuf.Int64Value
- (*account.UpdateAccountV2Request_AccountV2Avatar)(nil), // 71: bucketeer.account.UpdateAccountV2Request.AccountV2Avatar
- (*account.ConsoleAccount)(nil), // 72: bucketeer.account.ConsoleAccount
- (account.ListAccountsV2Request_OrderBy)(0), // 73: bucketeer.account.ListAccountsV2Request.OrderBy
- (account.ListAccountsV2Request_OrderDirection)(0), // 74: bucketeer.account.ListAccountsV2Request.OrderDirection
- (*wrapperspb.Int32Value)(nil), // 75: google.protobuf.Int32Value
+ (*GetCodeReferenceRequest)(nil), // 42: bucketeer.gateway.GetCodeReferenceRequest
+ (*GetCodeReferenceResponse)(nil), // 43: bucketeer.gateway.GetCodeReferenceResponse
+ (*ListCodeReferencesRequest)(nil), // 44: bucketeer.gateway.ListCodeReferencesRequest
+ (*ListCodeReferencesResponse)(nil), // 45: bucketeer.gateway.ListCodeReferencesResponse
+ (*CreateCodeReferenceRequest)(nil), // 46: bucketeer.gateway.CreateCodeReferenceRequest
+ (*CreateCodeReferenceResponse)(nil), // 47: bucketeer.gateway.CreateCodeReferenceResponse
+ (*UpdateCodeReferenceRequest)(nil), // 48: bucketeer.gateway.UpdateCodeReferenceRequest
+ (*UpdateCodeReferenceResponse)(nil), // 49: bucketeer.gateway.UpdateCodeReferenceResponse
+ (*DeleteCodeReferenceRequest)(nil), // 50: bucketeer.gateway.DeleteCodeReferenceRequest
+ (*DeleteCodeReferenceResponse)(nil), // 51: bucketeer.gateway.DeleteCodeReferenceResponse
+ (*GetEvaluationsRequest_UserEvaluationCondition)(nil), // 52: bucketeer.gateway.GetEvaluationsRequest.UserEvaluationCondition
+ (*RegisterEventsResponse_Error)(nil), // 53: bucketeer.gateway.RegisterEventsResponse.Error
+ nil, // 54: bucketeer.gateway.RegisterEventsResponse.ErrorsEntry
+ (client.SourceId)(0), // 55: bucketeer.event.client.SourceId
+ (*feature.Feature)(nil), // 56: bucketeer.feature.Feature
+ (*feature.SegmentUsers)(nil), // 57: bucketeer.feature.SegmentUsers
+ (*user.User)(nil), // 58: bucketeer.user.User
+ (feature.UserEvaluations_State)(0), // 59: bucketeer.feature.UserEvaluations.State
+ (*feature.UserEvaluations)(nil), // 60: bucketeer.feature.UserEvaluations
+ (*feature.Evaluation)(nil), // 61: bucketeer.feature.Evaluation
+ (*client.Event)(nil), // 62: bucketeer.event.client.Event
+ (feature.Feature_VariationType)(0), // 63: bucketeer.feature.Feature.VariationType
+ (*feature.Variation)(nil), // 64: bucketeer.feature.Variation
+ (feature.ListFeaturesRequest_OrderBy)(0), // 65: bucketeer.feature.ListFeaturesRequest.OrderBy
+ (feature.ListFeaturesRequest_OrderDirection)(0), // 66: bucketeer.feature.ListFeaturesRequest.OrderDirection
+ (*wrapperspb.StringValue)(nil), // 67: google.protobuf.StringValue
+ (*wrapperspb.BoolValue)(nil), // 68: google.protobuf.BoolValue
+ (*feature.Prerequisite)(nil), // 69: bucketeer.feature.Prerequisite
+ (*feature.Target)(nil), // 70: bucketeer.feature.Target
+ (*feature.Rule)(nil), // 71: bucketeer.feature.Rule
+ (*feature.Strategy)(nil), // 72: bucketeer.feature.Strategy
+ (push.ListPushesRequest_OrderBy)(0), // 73: bucketeer.push.ListPushesRequest.OrderBy
+ (push.ListPushesRequest_OrderDirection)(0), // 74: bucketeer.push.ListPushesRequest.OrderDirection
+ (*push.Push)(nil), // 75: bucketeer.push.Push
+ (account.AccountV2_Role_Organization)(0), // 76: bucketeer.account.AccountV2.Role.Organization
+ (*account.AccountV2_EnvironmentRole)(nil), // 77: bucketeer.account.AccountV2.EnvironmentRole
+ (*account.AccountV2)(nil), // 78: bucketeer.account.AccountV2
+ (*account.UpdateAccountV2Request_OrganizationRoleValue)(nil), // 79: bucketeer.account.UpdateAccountV2Request.OrganizationRoleValue
+ (*wrapperspb.Int64Value)(nil), // 80: google.protobuf.Int64Value
+ (*account.UpdateAccountV2Request_AccountV2Avatar)(nil), // 81: bucketeer.account.UpdateAccountV2Request.AccountV2Avatar
+ (*account.ConsoleAccount)(nil), // 82: bucketeer.account.ConsoleAccount
+ (account.ListAccountsV2Request_OrderBy)(0), // 83: bucketeer.account.ListAccountsV2Request.OrderBy
+ (account.ListAccountsV2Request_OrderDirection)(0), // 84: bucketeer.account.ListAccountsV2Request.OrderDirection
+ (*wrapperspb.Int32Value)(nil), // 85: google.protobuf.Int32Value
+ (*coderef.CodeReference)(nil), // 86: bucketeer.coderef.CodeReference
+ (coderef.ListCodeReferencesRequest_OrderBy)(0), // 87: bucketeer.coderef.ListCodeReferencesRequest.OrderBy
+ (coderef.ListCodeReferencesRequest_OrderDirection)(0), // 88: bucketeer.coderef.ListCodeReferencesRequest.OrderDirection
+ (coderef.CodeReference_RepositoryType)(0), // 89: bucketeer.coderef.CodeReference.RepositoryType
}
var file_proto_gateway_service_proto_depIdxs = []int32{
- 45, // 0: bucketeer.gateway.GetFeatureFlagsRequest.source_id:type_name -> bucketeer.event.client.SourceId
- 46, // 1: bucketeer.gateway.GetFeatureFlagsResponse.features:type_name -> bucketeer.feature.Feature
- 45, // 2: bucketeer.gateway.GetSegmentUsersRequest.source_id:type_name -> bucketeer.event.client.SourceId
- 47, // 3: bucketeer.gateway.GetSegmentUsersResponse.segment_users:type_name -> bucketeer.feature.SegmentUsers
- 48, // 4: bucketeer.gateway.GetEvaluationsRequest.user:type_name -> bucketeer.user.User
- 45, // 5: bucketeer.gateway.GetEvaluationsRequest.source_id:type_name -> bucketeer.event.client.SourceId
- 42, // 6: bucketeer.gateway.GetEvaluationsRequest.user_evaluation_condition:type_name -> bucketeer.gateway.GetEvaluationsRequest.UserEvaluationCondition
- 49, // 7: bucketeer.gateway.GetEvaluationsResponse.state:type_name -> bucketeer.feature.UserEvaluations.State
- 50, // 8: bucketeer.gateway.GetEvaluationsResponse.evaluations:type_name -> bucketeer.feature.UserEvaluations
- 48, // 9: bucketeer.gateway.GetEvaluationRequest.user:type_name -> bucketeer.user.User
- 45, // 10: bucketeer.gateway.GetEvaluationRequest.source_id:type_name -> bucketeer.event.client.SourceId
- 51, // 11: bucketeer.gateway.GetEvaluationResponse.evaluation:type_name -> bucketeer.feature.Evaluation
- 52, // 12: bucketeer.gateway.RegisterEventsRequest.events:type_name -> bucketeer.event.client.Event
- 45, // 13: bucketeer.gateway.RegisterEventsRequest.source_id:type_name -> bucketeer.event.client.SourceId
- 44, // 14: bucketeer.gateway.RegisterEventsResponse.errors:type_name -> bucketeer.gateway.RegisterEventsResponse.ErrorsEntry
- 53, // 15: bucketeer.gateway.CreateFeatureRequest.variation_type:type_name -> bucketeer.feature.Feature.VariationType
- 54, // 16: bucketeer.gateway.CreateFeatureRequest.variations:type_name -> bucketeer.feature.Variation
- 46, // 17: bucketeer.gateway.CreateFeatureResponse.feature:type_name -> bucketeer.feature.Feature
- 46, // 18: bucketeer.gateway.GetFeatureResponse.feature:type_name -> bucketeer.feature.Feature
- 55, // 19: bucketeer.gateway.ListFeaturesRequest.order_by:type_name -> bucketeer.feature.ListFeaturesRequest.OrderBy
- 56, // 20: bucketeer.gateway.ListFeaturesRequest.order_direction:type_name -> bucketeer.feature.ListFeaturesRequest.OrderDirection
- 46, // 21: bucketeer.gateway.ListFeaturesResponse.features:type_name -> bucketeer.feature.Feature
- 57, // 22: bucketeer.gateway.UpdateFeatureRequest.name:type_name -> google.protobuf.StringValue
- 57, // 23: bucketeer.gateway.UpdateFeatureRequest.description:type_name -> google.protobuf.StringValue
- 58, // 24: bucketeer.gateway.UpdateFeatureRequest.enabled:type_name -> google.protobuf.BoolValue
- 58, // 25: bucketeer.gateway.UpdateFeatureRequest.archived:type_name -> google.protobuf.BoolValue
- 54, // 26: bucketeer.gateway.UpdateFeatureRequest.variations:type_name -> bucketeer.feature.Variation
- 59, // 27: bucketeer.gateway.UpdateFeatureRequest.prerequisites:type_name -> bucketeer.feature.Prerequisite
- 60, // 28: bucketeer.gateway.UpdateFeatureRequest.targets:type_name -> bucketeer.feature.Target
- 61, // 29: bucketeer.gateway.UpdateFeatureRequest.rules:type_name -> bucketeer.feature.Rule
- 62, // 30: bucketeer.gateway.UpdateFeatureRequest.default_strategy:type_name -> bucketeer.feature.Strategy
- 57, // 31: bucketeer.gateway.UpdateFeatureRequest.off_variation:type_name -> google.protobuf.StringValue
- 46, // 32: bucketeer.gateway.UpdateFeatureResponse.feature:type_name -> bucketeer.feature.Feature
- 63, // 33: bucketeer.gateway.ListPushesRequest.order_by:type_name -> bucketeer.push.ListPushesRequest.OrderBy
- 64, // 34: bucketeer.gateway.ListPushesRequest.order_direction:type_name -> bucketeer.push.ListPushesRequest.OrderDirection
- 65, // 35: bucketeer.gateway.ListPushesResponse.pushes:type_name -> bucketeer.push.Push
- 65, // 36: bucketeer.gateway.CreatePushResponse.push:type_name -> bucketeer.push.Push
- 65, // 37: bucketeer.gateway.GetPushResponse.push:type_name -> bucketeer.push.Push
- 57, // 38: bucketeer.gateway.UpdatePushRequest.name:type_name -> google.protobuf.StringValue
- 58, // 39: bucketeer.gateway.UpdatePushRequest.deleted:type_name -> google.protobuf.BoolValue
- 65, // 40: bucketeer.gateway.UpdatePushResponse.push:type_name -> bucketeer.push.Push
- 66, // 41: bucketeer.gateway.CreateAccountV2Request.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
- 67, // 42: bucketeer.gateway.CreateAccountV2Request.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
- 68, // 43: bucketeer.gateway.CreateAccountV2Response.account:type_name -> bucketeer.account.AccountV2
- 57, // 44: bucketeer.gateway.UpdateAccountV2Request.name:type_name -> google.protobuf.StringValue
- 57, // 45: bucketeer.gateway.UpdateAccountV2Request.avatar_image_url:type_name -> google.protobuf.StringValue
- 69, // 46: bucketeer.gateway.UpdateAccountV2Request.organization_role:type_name -> bucketeer.account.UpdateAccountV2Request.OrganizationRoleValue
- 67, // 47: bucketeer.gateway.UpdateAccountV2Request.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
- 57, // 48: bucketeer.gateway.UpdateAccountV2Request.first_name:type_name -> google.protobuf.StringValue
- 57, // 49: bucketeer.gateway.UpdateAccountV2Request.last_name:type_name -> google.protobuf.StringValue
- 57, // 50: bucketeer.gateway.UpdateAccountV2Request.language:type_name -> google.protobuf.StringValue
- 70, // 51: bucketeer.gateway.UpdateAccountV2Request.last_seen:type_name -> google.protobuf.Int64Value
- 71, // 52: bucketeer.gateway.UpdateAccountV2Request.avatar:type_name -> bucketeer.account.UpdateAccountV2Request.AccountV2Avatar
- 58, // 53: bucketeer.gateway.UpdateAccountV2Request.disabled:type_name -> google.protobuf.BoolValue
- 58, // 54: bucketeer.gateway.UpdateAccountV2Request.deleted:type_name -> google.protobuf.BoolValue
- 68, // 55: bucketeer.gateway.UpdateAccountV2Response.account:type_name -> bucketeer.account.AccountV2
- 68, // 56: bucketeer.gateway.GetAccountV2Response.account:type_name -> bucketeer.account.AccountV2
- 68, // 57: bucketeer.gateway.GetAccountV2ByEnvironmentIDResponse.account:type_name -> bucketeer.account.AccountV2
- 72, // 58: bucketeer.gateway.GetMeResponse.account:type_name -> bucketeer.account.ConsoleAccount
- 73, // 59: bucketeer.gateway.ListAccountsV2Request.order_by:type_name -> bucketeer.account.ListAccountsV2Request.OrderBy
- 74, // 60: bucketeer.gateway.ListAccountsV2Request.order_direction:type_name -> bucketeer.account.ListAccountsV2Request.OrderDirection
- 58, // 61: bucketeer.gateway.ListAccountsV2Request.disabled:type_name -> google.protobuf.BoolValue
- 75, // 62: bucketeer.gateway.ListAccountsV2Request.organization_role:type_name -> google.protobuf.Int32Value
- 57, // 63: bucketeer.gateway.ListAccountsV2Request.environment_id:type_name -> google.protobuf.StringValue
- 75, // 64: bucketeer.gateway.ListAccountsV2Request.environment_role:type_name -> google.protobuf.Int32Value
- 68, // 65: bucketeer.gateway.ListAccountsV2Response.accounts:type_name -> bucketeer.account.AccountV2
- 43, // 66: bucketeer.gateway.RegisterEventsResponse.ErrorsEntry.value:type_name -> bucketeer.gateway.RegisterEventsResponse.Error
- 6, // 67: bucketeer.gateway.Gateway.GetEvaluations:input_type -> bucketeer.gateway.GetEvaluationsRequest
- 8, // 68: bucketeer.gateway.Gateway.GetEvaluation:input_type -> bucketeer.gateway.GetEvaluationRequest
- 2, // 69: bucketeer.gateway.Gateway.GetFeatureFlags:input_type -> bucketeer.gateway.GetFeatureFlagsRequest
- 4, // 70: bucketeer.gateway.Gateway.GetSegmentUsers:input_type -> bucketeer.gateway.GetSegmentUsersRequest
- 10, // 71: bucketeer.gateway.Gateway.RegisterEvents:input_type -> bucketeer.gateway.RegisterEventsRequest
- 12, // 72: bucketeer.gateway.Gateway.Track:input_type -> bucketeer.gateway.TrackRequest
- 14, // 73: bucketeer.gateway.Gateway.CreateFeature:input_type -> bucketeer.gateway.CreateFeatureRequest
- 16, // 74: bucketeer.gateway.Gateway.GetFeature:input_type -> bucketeer.gateway.GetFeatureRequest
- 18, // 75: bucketeer.gateway.Gateway.ListFeatures:input_type -> bucketeer.gateway.ListFeaturesRequest
- 20, // 76: bucketeer.gateway.Gateway.UpdateFeature:input_type -> bucketeer.gateway.UpdateFeatureRequest
- 0, // 77: bucketeer.gateway.Gateway.Ping:input_type -> bucketeer.gateway.PingRequest
- 22, // 78: bucketeer.gateway.Gateway.ListPushes:input_type -> bucketeer.gateway.ListPushesRequest
- 24, // 79: bucketeer.gateway.Gateway.CreatePush:input_type -> bucketeer.gateway.CreatePushRequest
- 26, // 80: bucketeer.gateway.Gateway.GetPush:input_type -> bucketeer.gateway.GetPushRequest
- 28, // 81: bucketeer.gateway.Gateway.UpdatePush:input_type -> bucketeer.gateway.UpdatePushRequest
- 30, // 82: bucketeer.gateway.Gateway.CreateAccountV2:input_type -> bucketeer.gateway.CreateAccountV2Request
- 32, // 83: bucketeer.gateway.Gateway.UpdateAccountV2:input_type -> bucketeer.gateway.UpdateAccountV2Request
- 34, // 84: bucketeer.gateway.Gateway.GetAccountV2:input_type -> bucketeer.gateway.GetAccountV2Request
- 36, // 85: bucketeer.gateway.Gateway.GetAccountV2ByEnvironmentID:input_type -> bucketeer.gateway.GetAccountV2ByEnvironmentIDRequest
- 38, // 86: bucketeer.gateway.Gateway.GetMe:input_type -> bucketeer.gateway.GetMeRequest
- 40, // 87: bucketeer.gateway.Gateway.ListAccountsV2:input_type -> bucketeer.gateway.ListAccountsV2Request
- 7, // 88: bucketeer.gateway.Gateway.GetEvaluations:output_type -> bucketeer.gateway.GetEvaluationsResponse
- 9, // 89: bucketeer.gateway.Gateway.GetEvaluation:output_type -> bucketeer.gateway.GetEvaluationResponse
- 3, // 90: bucketeer.gateway.Gateway.GetFeatureFlags:output_type -> bucketeer.gateway.GetFeatureFlagsResponse
- 5, // 91: bucketeer.gateway.Gateway.GetSegmentUsers:output_type -> bucketeer.gateway.GetSegmentUsersResponse
- 11, // 92: bucketeer.gateway.Gateway.RegisterEvents:output_type -> bucketeer.gateway.RegisterEventsResponse
- 13, // 93: bucketeer.gateway.Gateway.Track:output_type -> bucketeer.gateway.TrackResponse
- 15, // 94: bucketeer.gateway.Gateway.CreateFeature:output_type -> bucketeer.gateway.CreateFeatureResponse
- 17, // 95: bucketeer.gateway.Gateway.GetFeature:output_type -> bucketeer.gateway.GetFeatureResponse
- 19, // 96: bucketeer.gateway.Gateway.ListFeatures:output_type -> bucketeer.gateway.ListFeaturesResponse
- 21, // 97: bucketeer.gateway.Gateway.UpdateFeature:output_type -> bucketeer.gateway.UpdateFeatureResponse
- 1, // 98: bucketeer.gateway.Gateway.Ping:output_type -> bucketeer.gateway.PingResponse
- 23, // 99: bucketeer.gateway.Gateway.ListPushes:output_type -> bucketeer.gateway.ListPushesResponse
- 25, // 100: bucketeer.gateway.Gateway.CreatePush:output_type -> bucketeer.gateway.CreatePushResponse
- 27, // 101: bucketeer.gateway.Gateway.GetPush:output_type -> bucketeer.gateway.GetPushResponse
- 29, // 102: bucketeer.gateway.Gateway.UpdatePush:output_type -> bucketeer.gateway.UpdatePushResponse
- 31, // 103: bucketeer.gateway.Gateway.CreateAccountV2:output_type -> bucketeer.gateway.CreateAccountV2Response
- 33, // 104: bucketeer.gateway.Gateway.UpdateAccountV2:output_type -> bucketeer.gateway.UpdateAccountV2Response
- 35, // 105: bucketeer.gateway.Gateway.GetAccountV2:output_type -> bucketeer.gateway.GetAccountV2Response
- 37, // 106: bucketeer.gateway.Gateway.GetAccountV2ByEnvironmentID:output_type -> bucketeer.gateway.GetAccountV2ByEnvironmentIDResponse
- 39, // 107: bucketeer.gateway.Gateway.GetMe:output_type -> bucketeer.gateway.GetMeResponse
- 41, // 108: bucketeer.gateway.Gateway.ListAccountsV2:output_type -> bucketeer.gateway.ListAccountsV2Response
- 88, // [88:109] is the sub-list for method output_type
- 67, // [67:88] is the sub-list for method input_type
- 67, // [67:67] is the sub-list for extension type_name
- 67, // [67:67] is the sub-list for extension extendee
- 0, // [0:67] is the sub-list for field type_name
+ 55, // 0: bucketeer.gateway.GetFeatureFlagsRequest.source_id:type_name -> bucketeer.event.client.SourceId
+ 56, // 1: bucketeer.gateway.GetFeatureFlagsResponse.features:type_name -> bucketeer.feature.Feature
+ 55, // 2: bucketeer.gateway.GetSegmentUsersRequest.source_id:type_name -> bucketeer.event.client.SourceId
+ 57, // 3: bucketeer.gateway.GetSegmentUsersResponse.segment_users:type_name -> bucketeer.feature.SegmentUsers
+ 58, // 4: bucketeer.gateway.GetEvaluationsRequest.user:type_name -> bucketeer.user.User
+ 55, // 5: bucketeer.gateway.GetEvaluationsRequest.source_id:type_name -> bucketeer.event.client.SourceId
+ 52, // 6: bucketeer.gateway.GetEvaluationsRequest.user_evaluation_condition:type_name -> bucketeer.gateway.GetEvaluationsRequest.UserEvaluationCondition
+ 59, // 7: bucketeer.gateway.GetEvaluationsResponse.state:type_name -> bucketeer.feature.UserEvaluations.State
+ 60, // 8: bucketeer.gateway.GetEvaluationsResponse.evaluations:type_name -> bucketeer.feature.UserEvaluations
+ 58, // 9: bucketeer.gateway.GetEvaluationRequest.user:type_name -> bucketeer.user.User
+ 55, // 10: bucketeer.gateway.GetEvaluationRequest.source_id:type_name -> bucketeer.event.client.SourceId
+ 61, // 11: bucketeer.gateway.GetEvaluationResponse.evaluation:type_name -> bucketeer.feature.Evaluation
+ 62, // 12: bucketeer.gateway.RegisterEventsRequest.events:type_name -> bucketeer.event.client.Event
+ 55, // 13: bucketeer.gateway.RegisterEventsRequest.source_id:type_name -> bucketeer.event.client.SourceId
+ 54, // 14: bucketeer.gateway.RegisterEventsResponse.errors:type_name -> bucketeer.gateway.RegisterEventsResponse.ErrorsEntry
+ 63, // 15: bucketeer.gateway.CreateFeatureRequest.variation_type:type_name -> bucketeer.feature.Feature.VariationType
+ 64, // 16: bucketeer.gateway.CreateFeatureRequest.variations:type_name -> bucketeer.feature.Variation
+ 56, // 17: bucketeer.gateway.CreateFeatureResponse.feature:type_name -> bucketeer.feature.Feature
+ 56, // 18: bucketeer.gateway.GetFeatureResponse.feature:type_name -> bucketeer.feature.Feature
+ 65, // 19: bucketeer.gateway.ListFeaturesRequest.order_by:type_name -> bucketeer.feature.ListFeaturesRequest.OrderBy
+ 66, // 20: bucketeer.gateway.ListFeaturesRequest.order_direction:type_name -> bucketeer.feature.ListFeaturesRequest.OrderDirection
+ 56, // 21: bucketeer.gateway.ListFeaturesResponse.features:type_name -> bucketeer.feature.Feature
+ 67, // 22: bucketeer.gateway.UpdateFeatureRequest.name:type_name -> google.protobuf.StringValue
+ 67, // 23: bucketeer.gateway.UpdateFeatureRequest.description:type_name -> google.protobuf.StringValue
+ 68, // 24: bucketeer.gateway.UpdateFeatureRequest.enabled:type_name -> google.protobuf.BoolValue
+ 68, // 25: bucketeer.gateway.UpdateFeatureRequest.archived:type_name -> google.protobuf.BoolValue
+ 64, // 26: bucketeer.gateway.UpdateFeatureRequest.variations:type_name -> bucketeer.feature.Variation
+ 69, // 27: bucketeer.gateway.UpdateFeatureRequest.prerequisites:type_name -> bucketeer.feature.Prerequisite
+ 70, // 28: bucketeer.gateway.UpdateFeatureRequest.targets:type_name -> bucketeer.feature.Target
+ 71, // 29: bucketeer.gateway.UpdateFeatureRequest.rules:type_name -> bucketeer.feature.Rule
+ 72, // 30: bucketeer.gateway.UpdateFeatureRequest.default_strategy:type_name -> bucketeer.feature.Strategy
+ 67, // 31: bucketeer.gateway.UpdateFeatureRequest.off_variation:type_name -> google.protobuf.StringValue
+ 56, // 32: bucketeer.gateway.UpdateFeatureResponse.feature:type_name -> bucketeer.feature.Feature
+ 73, // 33: bucketeer.gateway.ListPushesRequest.order_by:type_name -> bucketeer.push.ListPushesRequest.OrderBy
+ 74, // 34: bucketeer.gateway.ListPushesRequest.order_direction:type_name -> bucketeer.push.ListPushesRequest.OrderDirection
+ 75, // 35: bucketeer.gateway.ListPushesResponse.pushes:type_name -> bucketeer.push.Push
+ 75, // 36: bucketeer.gateway.CreatePushResponse.push:type_name -> bucketeer.push.Push
+ 75, // 37: bucketeer.gateway.GetPushResponse.push:type_name -> bucketeer.push.Push
+ 67, // 38: bucketeer.gateway.UpdatePushRequest.name:type_name -> google.protobuf.StringValue
+ 68, // 39: bucketeer.gateway.UpdatePushRequest.deleted:type_name -> google.protobuf.BoolValue
+ 75, // 40: bucketeer.gateway.UpdatePushResponse.push:type_name -> bucketeer.push.Push
+ 76, // 41: bucketeer.gateway.CreateAccountV2Request.organization_role:type_name -> bucketeer.account.AccountV2.Role.Organization
+ 77, // 42: bucketeer.gateway.CreateAccountV2Request.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
+ 78, // 43: bucketeer.gateway.CreateAccountV2Response.account:type_name -> bucketeer.account.AccountV2
+ 67, // 44: bucketeer.gateway.UpdateAccountV2Request.name:type_name -> google.protobuf.StringValue
+ 67, // 45: bucketeer.gateway.UpdateAccountV2Request.avatar_image_url:type_name -> google.protobuf.StringValue
+ 79, // 46: bucketeer.gateway.UpdateAccountV2Request.organization_role:type_name -> bucketeer.account.UpdateAccountV2Request.OrganizationRoleValue
+ 77, // 47: bucketeer.gateway.UpdateAccountV2Request.environment_roles:type_name -> bucketeer.account.AccountV2.EnvironmentRole
+ 67, // 48: bucketeer.gateway.UpdateAccountV2Request.first_name:type_name -> google.protobuf.StringValue
+ 67, // 49: bucketeer.gateway.UpdateAccountV2Request.last_name:type_name -> google.protobuf.StringValue
+ 67, // 50: bucketeer.gateway.UpdateAccountV2Request.language:type_name -> google.protobuf.StringValue
+ 80, // 51: bucketeer.gateway.UpdateAccountV2Request.last_seen:type_name -> google.protobuf.Int64Value
+ 81, // 52: bucketeer.gateway.UpdateAccountV2Request.avatar:type_name -> bucketeer.account.UpdateAccountV2Request.AccountV2Avatar
+ 68, // 53: bucketeer.gateway.UpdateAccountV2Request.disabled:type_name -> google.protobuf.BoolValue
+ 68, // 54: bucketeer.gateway.UpdateAccountV2Request.deleted:type_name -> google.protobuf.BoolValue
+ 78, // 55: bucketeer.gateway.UpdateAccountV2Response.account:type_name -> bucketeer.account.AccountV2
+ 78, // 56: bucketeer.gateway.GetAccountV2Response.account:type_name -> bucketeer.account.AccountV2
+ 78, // 57: bucketeer.gateway.GetAccountV2ByEnvironmentIDResponse.account:type_name -> bucketeer.account.AccountV2
+ 82, // 58: bucketeer.gateway.GetMeResponse.account:type_name -> bucketeer.account.ConsoleAccount
+ 83, // 59: bucketeer.gateway.ListAccountsV2Request.order_by:type_name -> bucketeer.account.ListAccountsV2Request.OrderBy
+ 84, // 60: bucketeer.gateway.ListAccountsV2Request.order_direction:type_name -> bucketeer.account.ListAccountsV2Request.OrderDirection
+ 68, // 61: bucketeer.gateway.ListAccountsV2Request.disabled:type_name -> google.protobuf.BoolValue
+ 85, // 62: bucketeer.gateway.ListAccountsV2Request.organization_role:type_name -> google.protobuf.Int32Value
+ 67, // 63: bucketeer.gateway.ListAccountsV2Request.environment_id:type_name -> google.protobuf.StringValue
+ 85, // 64: bucketeer.gateway.ListAccountsV2Request.environment_role:type_name -> google.protobuf.Int32Value
+ 78, // 65: bucketeer.gateway.ListAccountsV2Response.accounts:type_name -> bucketeer.account.AccountV2
+ 86, // 66: bucketeer.gateway.GetCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 87, // 67: bucketeer.gateway.ListCodeReferencesRequest.order_by:type_name -> bucketeer.coderef.ListCodeReferencesRequest.OrderBy
+ 88, // 68: bucketeer.gateway.ListCodeReferencesRequest.order_direction:type_name -> bucketeer.coderef.ListCodeReferencesRequest.OrderDirection
+ 86, // 69: bucketeer.gateway.ListCodeReferencesResponse.code_references:type_name -> bucketeer.coderef.CodeReference
+ 89, // 70: bucketeer.gateway.CreateCodeReferenceRequest.repository_type:type_name -> bucketeer.coderef.CodeReference.RepositoryType
+ 86, // 71: bucketeer.gateway.CreateCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 86, // 72: bucketeer.gateway.UpdateCodeReferenceResponse.code_reference:type_name -> bucketeer.coderef.CodeReference
+ 53, // 73: bucketeer.gateway.RegisterEventsResponse.ErrorsEntry.value:type_name -> bucketeer.gateway.RegisterEventsResponse.Error
+ 6, // 74: bucketeer.gateway.Gateway.GetEvaluations:input_type -> bucketeer.gateway.GetEvaluationsRequest
+ 8, // 75: bucketeer.gateway.Gateway.GetEvaluation:input_type -> bucketeer.gateway.GetEvaluationRequest
+ 2, // 76: bucketeer.gateway.Gateway.GetFeatureFlags:input_type -> bucketeer.gateway.GetFeatureFlagsRequest
+ 4, // 77: bucketeer.gateway.Gateway.GetSegmentUsers:input_type -> bucketeer.gateway.GetSegmentUsersRequest
+ 10, // 78: bucketeer.gateway.Gateway.RegisterEvents:input_type -> bucketeer.gateway.RegisterEventsRequest
+ 12, // 79: bucketeer.gateway.Gateway.Track:input_type -> bucketeer.gateway.TrackRequest
+ 14, // 80: bucketeer.gateway.Gateway.CreateFeature:input_type -> bucketeer.gateway.CreateFeatureRequest
+ 16, // 81: bucketeer.gateway.Gateway.GetFeature:input_type -> bucketeer.gateway.GetFeatureRequest
+ 18, // 82: bucketeer.gateway.Gateway.ListFeatures:input_type -> bucketeer.gateway.ListFeaturesRequest
+ 20, // 83: bucketeer.gateway.Gateway.UpdateFeature:input_type -> bucketeer.gateway.UpdateFeatureRequest
+ 0, // 84: bucketeer.gateway.Gateway.Ping:input_type -> bucketeer.gateway.PingRequest
+ 22, // 85: bucketeer.gateway.Gateway.ListPushes:input_type -> bucketeer.gateway.ListPushesRequest
+ 24, // 86: bucketeer.gateway.Gateway.CreatePush:input_type -> bucketeer.gateway.CreatePushRequest
+ 26, // 87: bucketeer.gateway.Gateway.GetPush:input_type -> bucketeer.gateway.GetPushRequest
+ 28, // 88: bucketeer.gateway.Gateway.UpdatePush:input_type -> bucketeer.gateway.UpdatePushRequest
+ 30, // 89: bucketeer.gateway.Gateway.CreateAccountV2:input_type -> bucketeer.gateway.CreateAccountV2Request
+ 32, // 90: bucketeer.gateway.Gateway.UpdateAccountV2:input_type -> bucketeer.gateway.UpdateAccountV2Request
+ 34, // 91: bucketeer.gateway.Gateway.GetAccountV2:input_type -> bucketeer.gateway.GetAccountV2Request
+ 36, // 92: bucketeer.gateway.Gateway.GetAccountV2ByEnvironmentID:input_type -> bucketeer.gateway.GetAccountV2ByEnvironmentIDRequest
+ 38, // 93: bucketeer.gateway.Gateway.GetMe:input_type -> bucketeer.gateway.GetMeRequest
+ 40, // 94: bucketeer.gateway.Gateway.ListAccountsV2:input_type -> bucketeer.gateway.ListAccountsV2Request
+ 42, // 95: bucketeer.gateway.Gateway.GetCodeReference:input_type -> bucketeer.gateway.GetCodeReferenceRequest
+ 44, // 96: bucketeer.gateway.Gateway.ListCodeReferences:input_type -> bucketeer.gateway.ListCodeReferencesRequest
+ 46, // 97: bucketeer.gateway.Gateway.CreateCodeReference:input_type -> bucketeer.gateway.CreateCodeReferenceRequest
+ 48, // 98: bucketeer.gateway.Gateway.UpdateCodeReference:input_type -> bucketeer.gateway.UpdateCodeReferenceRequest
+ 50, // 99: bucketeer.gateway.Gateway.DeleteCodeReference:input_type -> bucketeer.gateway.DeleteCodeReferenceRequest
+ 7, // 100: bucketeer.gateway.Gateway.GetEvaluations:output_type -> bucketeer.gateway.GetEvaluationsResponse
+ 9, // 101: bucketeer.gateway.Gateway.GetEvaluation:output_type -> bucketeer.gateway.GetEvaluationResponse
+ 3, // 102: bucketeer.gateway.Gateway.GetFeatureFlags:output_type -> bucketeer.gateway.GetFeatureFlagsResponse
+ 5, // 103: bucketeer.gateway.Gateway.GetSegmentUsers:output_type -> bucketeer.gateway.GetSegmentUsersResponse
+ 11, // 104: bucketeer.gateway.Gateway.RegisterEvents:output_type -> bucketeer.gateway.RegisterEventsResponse
+ 13, // 105: bucketeer.gateway.Gateway.Track:output_type -> bucketeer.gateway.TrackResponse
+ 15, // 106: bucketeer.gateway.Gateway.CreateFeature:output_type -> bucketeer.gateway.CreateFeatureResponse
+ 17, // 107: bucketeer.gateway.Gateway.GetFeature:output_type -> bucketeer.gateway.GetFeatureResponse
+ 19, // 108: bucketeer.gateway.Gateway.ListFeatures:output_type -> bucketeer.gateway.ListFeaturesResponse
+ 21, // 109: bucketeer.gateway.Gateway.UpdateFeature:output_type -> bucketeer.gateway.UpdateFeatureResponse
+ 1, // 110: bucketeer.gateway.Gateway.Ping:output_type -> bucketeer.gateway.PingResponse
+ 23, // 111: bucketeer.gateway.Gateway.ListPushes:output_type -> bucketeer.gateway.ListPushesResponse
+ 25, // 112: bucketeer.gateway.Gateway.CreatePush:output_type -> bucketeer.gateway.CreatePushResponse
+ 27, // 113: bucketeer.gateway.Gateway.GetPush:output_type -> bucketeer.gateway.GetPushResponse
+ 29, // 114: bucketeer.gateway.Gateway.UpdatePush:output_type -> bucketeer.gateway.UpdatePushResponse
+ 31, // 115: bucketeer.gateway.Gateway.CreateAccountV2:output_type -> bucketeer.gateway.CreateAccountV2Response
+ 33, // 116: bucketeer.gateway.Gateway.UpdateAccountV2:output_type -> bucketeer.gateway.UpdateAccountV2Response
+ 35, // 117: bucketeer.gateway.Gateway.GetAccountV2:output_type -> bucketeer.gateway.GetAccountV2Response
+ 37, // 118: bucketeer.gateway.Gateway.GetAccountV2ByEnvironmentID:output_type -> bucketeer.gateway.GetAccountV2ByEnvironmentIDResponse
+ 39, // 119: bucketeer.gateway.Gateway.GetMe:output_type -> bucketeer.gateway.GetMeResponse
+ 41, // 120: bucketeer.gateway.Gateway.ListAccountsV2:output_type -> bucketeer.gateway.ListAccountsV2Response
+ 43, // 121: bucketeer.gateway.Gateway.GetCodeReference:output_type -> bucketeer.gateway.GetCodeReferenceResponse
+ 45, // 122: bucketeer.gateway.Gateway.ListCodeReferences:output_type -> bucketeer.gateway.ListCodeReferencesResponse
+ 47, // 123: bucketeer.gateway.Gateway.CreateCodeReference:output_type -> bucketeer.gateway.CreateCodeReferenceResponse
+ 49, // 124: bucketeer.gateway.Gateway.UpdateCodeReference:output_type -> bucketeer.gateway.UpdateCodeReferenceResponse
+ 51, // 125: bucketeer.gateway.Gateway.DeleteCodeReference:output_type -> bucketeer.gateway.DeleteCodeReferenceResponse
+ 100, // [100:126] is the sub-list for method output_type
+ 74, // [74:100] is the sub-list for method input_type
+ 74, // [74:74] is the sub-list for extension type_name
+ 74, // [74:74] is the sub-list for extension extendee
+ 0, // [0:74] is the sub-list for field type_name
}
func init() { file_proto_gateway_service_proto_init() }
@@ -4668,7 +5587,7 @@ func file_proto_gateway_service_proto_init() {
}
}
file_proto_gateway_service_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetEvaluationsRequest_UserEvaluationCondition); i {
+ switch v := v.(*GetCodeReferenceRequest); i {
case 0:
return &v.state
case 1:
@@ -4680,6 +5599,126 @@ func file_proto_gateway_service_proto_init() {
}
}
file_proto_gateway_service_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListCodeReferencesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListCodeReferencesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UpdateCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UpdateCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteCodeReferenceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteCodeReferenceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetEvaluationsRequest_UserEvaluationCondition); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_gateway_service_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RegisterEventsResponse_Error); i {
case 0:
return &v.state
@@ -4698,7 +5737,7 @@ func file_proto_gateway_service_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_gateway_service_proto_rawDesc,
NumEnums: 0,
- NumMessages: 45,
+ NumMessages: 55,
NumExtensions: 0,
NumServices: 1,
},
@@ -4745,6 +5784,11 @@ type GatewayClient interface {
GetAccountV2ByEnvironmentID(ctx context.Context, in *GetAccountV2ByEnvironmentIDRequest, opts ...grpc.CallOption) (*GetAccountV2ByEnvironmentIDResponse, error)
GetMe(ctx context.Context, in *GetMeRequest, opts ...grpc.CallOption) (*GetMeResponse, error)
ListAccountsV2(ctx context.Context, in *ListAccountsV2Request, opts ...grpc.CallOption) (*ListAccountsV2Response, error)
+ GetCodeReference(ctx context.Context, in *GetCodeReferenceRequest, opts ...grpc.CallOption) (*GetCodeReferenceResponse, error)
+ ListCodeReferences(ctx context.Context, in *ListCodeReferencesRequest, opts ...grpc.CallOption) (*ListCodeReferencesResponse, error)
+ CreateCodeReference(ctx context.Context, in *CreateCodeReferenceRequest, opts ...grpc.CallOption) (*CreateCodeReferenceResponse, error)
+ UpdateCodeReference(ctx context.Context, in *UpdateCodeReferenceRequest, opts ...grpc.CallOption) (*UpdateCodeReferenceResponse, error)
+ DeleteCodeReference(ctx context.Context, in *DeleteCodeReferenceRequest, opts ...grpc.CallOption) (*DeleteCodeReferenceResponse, error)
}
type gatewayClient struct {
@@ -4944,6 +5988,51 @@ func (c *gatewayClient) ListAccountsV2(ctx context.Context, in *ListAccountsV2Re
return out, nil
}
+func (c *gatewayClient) GetCodeReference(ctx context.Context, in *GetCodeReferenceRequest, opts ...grpc.CallOption) (*GetCodeReferenceResponse, error) {
+ out := new(GetCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.gateway.Gateway/GetCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *gatewayClient) ListCodeReferences(ctx context.Context, in *ListCodeReferencesRequest, opts ...grpc.CallOption) (*ListCodeReferencesResponse, error) {
+ out := new(ListCodeReferencesResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.gateway.Gateway/ListCodeReferences", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *gatewayClient) CreateCodeReference(ctx context.Context, in *CreateCodeReferenceRequest, opts ...grpc.CallOption) (*CreateCodeReferenceResponse, error) {
+ out := new(CreateCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.gateway.Gateway/CreateCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *gatewayClient) UpdateCodeReference(ctx context.Context, in *UpdateCodeReferenceRequest, opts ...grpc.CallOption) (*UpdateCodeReferenceResponse, error) {
+ out := new(UpdateCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.gateway.Gateway/UpdateCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *gatewayClient) DeleteCodeReference(ctx context.Context, in *DeleteCodeReferenceRequest, opts ...grpc.CallOption) (*DeleteCodeReferenceResponse, error) {
+ out := new(DeleteCodeReferenceResponse)
+ err := c.cc.Invoke(ctx, "/bucketeer.gateway.Gateway/DeleteCodeReference", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// GatewayServer is the server API for Gateway service.
type GatewayServer interface {
GetEvaluations(context.Context, *GetEvaluationsRequest) (*GetEvaluationsResponse, error)
@@ -4967,6 +6056,11 @@ type GatewayServer interface {
GetAccountV2ByEnvironmentID(context.Context, *GetAccountV2ByEnvironmentIDRequest) (*GetAccountV2ByEnvironmentIDResponse, error)
GetMe(context.Context, *GetMeRequest) (*GetMeResponse, error)
ListAccountsV2(context.Context, *ListAccountsV2Request) (*ListAccountsV2Response, error)
+ GetCodeReference(context.Context, *GetCodeReferenceRequest) (*GetCodeReferenceResponse, error)
+ ListCodeReferences(context.Context, *ListCodeReferencesRequest) (*ListCodeReferencesResponse, error)
+ CreateCodeReference(context.Context, *CreateCodeReferenceRequest) (*CreateCodeReferenceResponse, error)
+ UpdateCodeReference(context.Context, *UpdateCodeReferenceRequest) (*UpdateCodeReferenceResponse, error)
+ DeleteCodeReference(context.Context, *DeleteCodeReferenceRequest) (*DeleteCodeReferenceResponse, error)
}
// UnimplementedGatewayServer can be embedded to have forward compatible implementations.
@@ -5036,6 +6130,21 @@ func (*UnimplementedGatewayServer) GetMe(context.Context, *GetMeRequest) (*GetMe
func (*UnimplementedGatewayServer) ListAccountsV2(context.Context, *ListAccountsV2Request) (*ListAccountsV2Response, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListAccountsV2 not implemented")
}
+func (*UnimplementedGatewayServer) GetCodeReference(context.Context, *GetCodeReferenceRequest) (*GetCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetCodeReference not implemented")
+}
+func (*UnimplementedGatewayServer) ListCodeReferences(context.Context, *ListCodeReferencesRequest) (*ListCodeReferencesResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListCodeReferences not implemented")
+}
+func (*UnimplementedGatewayServer) CreateCodeReference(context.Context, *CreateCodeReferenceRequest) (*CreateCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method CreateCodeReference not implemented")
+}
+func (*UnimplementedGatewayServer) UpdateCodeReference(context.Context, *UpdateCodeReferenceRequest) (*UpdateCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UpdateCodeReference not implemented")
+}
+func (*UnimplementedGatewayServer) DeleteCodeReference(context.Context, *DeleteCodeReferenceRequest) (*DeleteCodeReferenceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteCodeReference not implemented")
+}
func RegisterGatewayServer(s *grpc.Server, srv GatewayServer) {
s.RegisterService(&_Gateway_serviceDesc, srv)
@@ -5419,6 +6528,96 @@ func _Gateway_ListAccountsV2_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
+func _Gateway_GetCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GatewayServer).GetCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.gateway.Gateway/GetCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GatewayServer).GetCodeReference(ctx, req.(*GetCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Gateway_ListCodeReferences_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListCodeReferencesRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GatewayServer).ListCodeReferences(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.gateway.Gateway/ListCodeReferences",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GatewayServer).ListCodeReferences(ctx, req.(*ListCodeReferencesRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Gateway_CreateCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CreateCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GatewayServer).CreateCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.gateway.Gateway/CreateCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GatewayServer).CreateCodeReference(ctx, req.(*CreateCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Gateway_UpdateCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpdateCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GatewayServer).UpdateCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.gateway.Gateway/UpdateCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GatewayServer).UpdateCodeReference(ctx, req.(*UpdateCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Gateway_DeleteCodeReference_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DeleteCodeReferenceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(GatewayServer).DeleteCodeReference(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/bucketeer.gateway.Gateway/DeleteCodeReference",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(GatewayServer).DeleteCodeReference(ctx, req.(*DeleteCodeReferenceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
var _Gateway_serviceDesc = grpc.ServiceDesc{
ServiceName: "bucketeer.gateway.Gateway",
HandlerType: (*GatewayServer)(nil),
@@ -5507,6 +6706,26 @@ var _Gateway_serviceDesc = grpc.ServiceDesc{
MethodName: "ListAccountsV2",
Handler: _Gateway_ListAccountsV2_Handler,
},
+ {
+ MethodName: "GetCodeReference",
+ Handler: _Gateway_GetCodeReference_Handler,
+ },
+ {
+ MethodName: "ListCodeReferences",
+ Handler: _Gateway_ListCodeReferences_Handler,
+ },
+ {
+ MethodName: "CreateCodeReference",
+ Handler: _Gateway_CreateCodeReference_Handler,
+ },
+ {
+ MethodName: "UpdateCodeReference",
+ Handler: _Gateway_UpdateCodeReference_Handler,
+ },
+ {
+ MethodName: "DeleteCodeReference",
+ Handler: _Gateway_DeleteCodeReference_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "proto/gateway/service.proto",
diff --git a/proto/gateway/service.proto b/proto/gateway/service.proto
index 4689d0fe59..678bbf7045 100644
--- a/proto/gateway/service.proto
+++ b/proto/gateway/service.proto
@@ -36,6 +36,8 @@ import "proto/push/service.proto";
import "proto/account/service.proto";
import "proto/account/account.proto";
import "proto/event/client/event.proto";
+import "proto/coderef/code_reference.proto";
+import "proto/coderef/service.proto";
message PingRequest {}
@@ -320,6 +322,70 @@ message ListAccountsV2Response {
int64 total_count = 3;
}
+message GetCodeReferenceRequest {
+ string id = 1;
+}
+
+message GetCodeReferenceResponse {
+ bucketeer.coderef.CodeReference code_reference = 1;
+}
+
+message ListCodeReferencesRequest {
+ int64 page_size = 1;
+ string cursor = 2;
+ bucketeer.coderef.ListCodeReferencesRequest.OrderBy order_by = 3;
+ bucketeer.coderef.ListCodeReferencesRequest.OrderDirection order_direction =
+ 4;
+ string search_keyword = 5;
+ string feature_id = 6;
+}
+
+message ListCodeReferencesResponse {
+ repeated bucketeer.coderef.CodeReference code_references = 1;
+ string cursor = 2;
+ int64 total_count = 3;
+}
+
+message CreateCodeReferenceRequest {
+ string feature_id = 1;
+ string environment_id = 2;
+ string file_path = 3;
+ int32 line_number = 4;
+ string code_snippet = 5;
+ string content_hash = 6;
+ repeated string aliases = 7;
+ string repository_name = 8;
+ string repository_owner = 9;
+ bucketeer.coderef.CodeReference.RepositoryType repository_type = 10;
+ string repository_branch = 11;
+ string commit_hash = 12;
+}
+
+message CreateCodeReferenceResponse {
+ bucketeer.coderef.CodeReference code_reference = 1;
+}
+
+message UpdateCodeReferenceRequest {
+ string id = 1;
+ string file_path = 2;
+ int32 line_number = 3;
+ string code_snippet = 4;
+ string content_hash = 5;
+ repeated string aliases = 6;
+ string repository_branch = 7;
+ string commit_hash = 8;
+}
+
+message UpdateCodeReferenceResponse {
+ bucketeer.coderef.CodeReference code_reference = 1;
+}
+
+message DeleteCodeReferenceRequest {
+ string id = 1;
+}
+
+message DeleteCodeReferenceResponse {}
+
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
info: { title: "Bucketeer Gateway Service" version: "1.0" }
schemes: HTTPS
@@ -787,4 +853,106 @@ service Gateway {
}
};
}
+ rpc GetCodeReference(GetCodeReferenceRequest)
+ returns (GetCodeReferenceResponse) {
+ option (google.api.http) = {
+ get: "/v1/code_references/{id}"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Get",
+ description: "Get a code reference. To call this API, you need a `READ` API Key role.",
+ tags: "Code References",
+ operation_id: "api.gateway.v1.code_references.get",
+ parameters: {
+ headers: {
+ name: "authorization"
+ description: "The API Key generated on the Admin Console."
+ type: STRING,
+ required: true
+ }
+ }
+ };
+ }
+ rpc ListCodeReferences(ListCodeReferencesRequest)
+ returns (ListCodeReferencesResponse) {
+ option (google.api.http) = {
+ get: "/v1/code_references"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "List",
+ description: "List code references. To call this API, you need a `READ` API Key role.",
+ tags: "Code References",
+ operation_id: "api.gateway.v1.code_references.list",
+ parameters: {
+ headers: {
+ name: "authorization"
+ description: "The API Key generated on the Admin Console."
+ type: STRING,
+ required: true
+ }
+ }
+ };
+ }
+ rpc CreateCodeReference(CreateCodeReferenceRequest)
+ returns (CreateCodeReferenceResponse) {
+ option (google.api.http) = {
+ post: "/v1/code_references"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Create",
+ description: "Create a new code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.",
+ tags: "Code References",
+ operation_id: "api.gateway.v1.code_references.create",
+ parameters: {
+ headers: {
+ name: "authorization"
+ description: "The API Key generated on the Admin Console."
+ type: STRING,
+ required: true
+ }
+ }
+ };
+ }
+ rpc UpdateCodeReference(UpdateCodeReferenceRequest)
+ returns (UpdateCodeReferenceResponse) {
+ option (google.api.http) = {
+ patch: "/v1/code_references/{id}"
+ body: "*"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Update",
+ description: "Update a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.",
+ tags: "Code References",
+ operation_id: "api.gateway.v1.code_references.update",
+ parameters: {
+ headers: {
+ name: "authorization"
+ description: "The API Key generated on the Admin Console."
+ type: STRING,
+ required: true
+ }
+ }
+ };
+ }
+ rpc DeleteCodeReference(DeleteCodeReferenceRequest)
+ returns (DeleteCodeReferenceResponse) {
+ option (google.api.http) = {
+ delete: "/v1/code_references/{id}"
+ };
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
+ summary: "Delete",
+ description: "Delete a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role.",
+ tags: "Code References",
+ operation_id: "api.gateway.v1.code_references.delete",
+ parameters: {
+ headers: {
+ name: "authorization"
+ description: "The API Key generated on the Admin Console."
+ type: STRING,
+ required: true
+ }
+ }
+ };
+ }
}
diff --git a/proto/notification/proto_descriptor.pb b/proto/notification/proto_descriptor.pb
index 9d837c069d..c4392d2ed1 100644
Binary files a/proto/notification/proto_descriptor.pb and b/proto/notification/proto_descriptor.pb differ
diff --git a/proto/notification/subscription.pb.go b/proto/notification/subscription.pb.go
index 56a86b8fd9..c3addedcdf 100644
--- a/proto/notification/subscription.pb.go
+++ b/proto/notification/subscription.pb.go
@@ -55,6 +55,7 @@ const (
Subscription_DOMAIN_EVENT_ORGANIZATION Subscription_SourceType = 15
Subscription_DOMAIN_EVENT_FLAG_TRIGGER Subscription_SourceType = 16
Subscription_DOMAIN_EVENT_TAG Subscription_SourceType = 17
+ Subscription_DOMAIN_EVENT_CODEREF Subscription_SourceType = 18
Subscription_FEATURE_STALE Subscription_SourceType = 100
Subscription_EXPERIMENT_RUNNING Subscription_SourceType = 200
Subscription_MAU_COUNT Subscription_SourceType = 300
@@ -81,6 +82,7 @@ var (
15: "DOMAIN_EVENT_ORGANIZATION",
16: "DOMAIN_EVENT_FLAG_TRIGGER",
17: "DOMAIN_EVENT_TAG",
+ 18: "DOMAIN_EVENT_CODEREF",
100: "FEATURE_STALE",
200: "EXPERIMENT_RUNNING",
300: "MAU_COUNT",
@@ -104,6 +106,7 @@ var (
"DOMAIN_EVENT_ORGANIZATION": 15,
"DOMAIN_EVENT_FLAG_TRIGGER": 16,
"DOMAIN_EVENT_TAG": 17,
+ "DOMAIN_EVENT_CODEREF": 18,
"FEATURE_STALE": 100,
"EXPERIMENT_RUNNING": 200,
"MAU_COUNT": 300,
@@ -257,7 +260,7 @@ var file_proto_notification_subscription_proto_rawDesc = []byte{
0x65, 0x72, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
0x22, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x07, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x07, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
@@ -280,7 +283,7 @@ var file_proto_notification_subscription_proto_rawDesc = []byte{
0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x29,
0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f,
- 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc9, 0x04, 0x0a, 0x0a, 0x53, 0x6f,
+ 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x0a, 0x53, 0x6f,
0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x4f, 0x4d, 0x41,
0x49, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45,
0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x56, 0x45,
@@ -313,15 +316,16 @@ var file_proto_notification_subscription_proto_rawDesc = []byte{
0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x45,
0x56, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45,
0x52, 0x10, 0x10, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x56,
- 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x11, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x45, 0x41,
- 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x45, 0x10, 0x64, 0x12, 0x17, 0x0a, 0x12,
- 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49,
- 0x4e, 0x47, 0x10, 0xc8, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x4d, 0x41, 0x55, 0x5f, 0x43, 0x4f, 0x55,
- 0x4e, 0x54, 0x10, 0xac, 0x02, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f,
- 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x4f, 0x4d,
+ 0x41, 0x49, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x52, 0x45,
+ 0x46, 0x10, 0x12, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53,
+ 0x54, 0x41, 0x4c, 0x45, 0x10, 0x64, 0x12, 0x17, 0x0a, 0x12, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49,
+ 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0xc8, 0x01, 0x12,
+ 0x0e, 0x0a, 0x09, 0x4d, 0x41, 0x55, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xac, 0x02, 0x42,
+ 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
diff --git a/proto/notification/subscription.proto b/proto/notification/subscription.proto
index 5b882303b1..f8b26e9eb9 100644
--- a/proto/notification/subscription.proto
+++ b/proto/notification/subscription.proto
@@ -39,6 +39,7 @@ message Subscription {
DOMAIN_EVENT_ORGANIZATION = 15;
DOMAIN_EVENT_FLAG_TRIGGER = 16;
DOMAIN_EVENT_TAG = 17;
+ DOMAIN_EVENT_CODEREF = 18;
FEATURE_STALE = 100;
EXPERIMENT_RUNNING = 200;
MAU_COUNT = 300;
diff --git a/proto/proto.lock b/proto/proto.lock
index c6247b2c2f..92f56e54f8 100644
--- a/proto/proto.lock
+++ b/proto/proto.lock
@@ -7885,6 +7885,10 @@
{
"name": "ExperimentCacher",
"integer": 17
+ },
+ {
+ "name": "TagDeleter",
+ "integer": 18
}
]
}
@@ -7928,430 +7932,351 @@
}
},
{
- "protopath": "environment:/:command.proto",
+ "protopath": "coderef:/:code_reference.proto",
"def": {
- "messages": [
+ "enums": [
{
- "name": "CreateEnvironmentV2Command",
- "fields": [
+ "name": "CodeReference.RepositoryType",
+ "enum_fields": [
{
- "id": 1,
- "name": "name",
- "type": "string"
+ "name": "REPOSITORY_TYPE_UNSPECIFIED"
},
{
- "id": 2,
- "name": "url_code",
- "type": "string"
+ "name": "GITHUB",
+ "integer": 1
},
{
- "id": 3,
- "name": "description",
- "type": "string"
+ "name": "GITLAB",
+ "integer": 2
},
{
- "id": 4,
- "name": "project_id",
- "type": "string"
+ "name": "BITBUCKET",
+ "integer": 3
},
{
- "id": 5,
- "name": "require_comment",
- "type": "bool"
- }
- ]
- },
- {
- "name": "RenameEnvironmentV2Command",
- "fields": [
- {
- "id": 1,
- "name": "name",
- "type": "string"
- }
- ]
- },
- {
- "name": "ChangeDescriptionEnvironmentV2Command",
- "fields": [
- {
- "id": 1,
- "name": "description",
- "type": "string"
+ "name": "CUSTOM",
+ "integer": 4
}
]
- },
- {
- "name": "ArchiveEnvironmentV2Command"
- },
- {
- "name": "UnarchiveEnvironmentV2Command"
- },
+ }
+ ],
+ "messages": [
{
- "name": "CreateProjectCommand",
+ "name": "CodeReference",
"fields": [
{
"id": 1,
- "name": "organization_id",
+ "name": "id",
"type": "string"
},
{
"id": 2,
- "name": "name",
+ "name": "feature_id",
"type": "string"
},
{
"id": 3,
- "name": "description",
+ "name": "file_path",
"type": "string"
},
{
"id": 4,
- "name": "url_code",
- "type": "string"
- }
- ]
- },
- {
- "name": "CreateTrialProjectCommand",
- "fields": [
- {
- "id": 1,
- "name": "id",
- "type": "string",
- "options": [
- {
- "name": "deprecated",
- "value": "true"
- }
- ]
+ "name": "line_number",
+ "type": "int32"
},
{
- "id": 2,
- "name": "email",
+ "id": 5,
+ "name": "code_snippet",
"type": "string"
},
{
- "id": 3,
- "name": "name",
+ "id": 6,
+ "name": "content_hash",
"type": "string"
},
{
- "id": 4,
- "name": "url_code",
- "type": "string"
+ "id": 7,
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
},
{
- "id": 5,
- "name": "owner_email",
+ "id": 8,
+ "name": "repository_name",
"type": "string"
- }
- ]
- },
- {
- "name": "RenameProjectCommand",
- "fields": [
+ },
{
- "id": 1,
- "name": "name",
+ "id": 9,
+ "name": "repository_owner",
"type": "string"
- }
- ]
- },
- {
- "name": "ChangeDescriptionProjectCommand",
- "fields": [
+ },
{
- "id": 1,
- "name": "description",
- "type": "string"
- }
- ]
- },
- {
- "name": "EnableProjectCommand"
- },
- {
- "name": "DisableProjectCommand"
- },
- {
- "name": "ConvertTrialProjectCommand"
- },
- {
- "name": "CreateOrganizationCommand",
- "fields": [
+ "id": 10,
+ "name": "repository_type",
+ "type": "RepositoryType"
+ },
{
- "id": 1,
- "name": "name",
+ "id": 11,
+ "name": "repository_branch",
"type": "string"
},
{
- "id": 2,
- "name": "url_code",
+ "id": 12,
+ "name": "commit_hash",
"type": "string"
},
{
- "id": 3,
- "name": "description",
+ "id": 13,
+ "name": "environment_id",
"type": "string"
},
{
- "id": 4,
- "name": "is_trial",
- "type": "bool"
+ "id": 14,
+ "name": "created_at",
+ "type": "int64"
},
{
- "id": 5,
- "name": "is_system_admin",
- "type": "bool"
+ "id": 15,
+ "name": "updated_at",
+ "type": "int64"
},
{
- "id": 6,
- "name": "owner_email",
+ "id": 16,
+ "name": "source_url",
"type": "string"
}
]
- },
+ }
+ ],
+ "package": {
+ "name": "bucketeer.coderef"
+ },
+ "options": [
{
- "name": "ChangeNameOrganizationCommand",
- "fields": [
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/coderef"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "coderef:/:service.proto",
+ "def": {
+ "enums": [
+ {
+ "name": "ListCodeReferencesRequest.OrderBy",
+ "enum_fields": [
{
- "id": 1,
- "name": "name",
- "type": "string"
+ "name": "DEFAULT"
+ },
+ {
+ "name": "CREATED_AT",
+ "integer": 1
+ },
+ {
+ "name": "UPDATED_AT",
+ "integer": 2
}
]
},
{
- "name": "ChangeDescriptionOrganizationCommand",
- "fields": [
+ "name": "ListCodeReferencesRequest.OrderDirection",
+ "enum_fields": [
{
- "id": 1,
- "name": "description",
- "type": "string"
+ "name": "ASC"
+ },
+ {
+ "name": "DESC",
+ "integer": 1
}
]
- },
+ }
+ ],
+ "messages": [
{
- "name": "ChangeOwnerEmailOrganizationCommand",
+ "name": "GetCodeReferenceRequest",
"fields": [
{
"id": 1,
- "name": "owner_email",
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "environment_id",
"type": "string"
}
]
},
{
- "name": "ChangeRequireCommentCommand",
+ "name": "GetCodeReferenceResponse",
"fields": [
{
"id": 1,
- "name": "require_comment",
- "type": "bool"
+ "name": "code_reference",
+ "type": "CodeReference"
}
]
},
{
- "name": "EnableOrganizationCommand"
- },
- {
- "name": "DisableOrganizationCommand"
- },
- {
- "name": "ArchiveOrganizationCommand"
- },
- {
- "name": "UnarchiveOrganizationCommand"
- },
- {
- "name": "ConvertTrialOrganizationCommand"
- }
- ],
- "package": {
- "name": "bucketeer.environment"
- },
- "options": [
- {
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/environment"
- }
- ]
- }
- },
- {
- "protopath": "environment:/:environment.proto",
- "def": {
- "messages": [
- {
- "name": "EnvironmentV2",
+ "name": "ListCodeReferencesRequest",
"fields": [
{
"id": 1,
- "name": "id",
+ "name": "environment_id",
"type": "string"
},
{
"id": 2,
- "name": "name",
+ "name": "feature_id",
"type": "string"
},
{
"id": 3,
- "name": "url_code",
+ "name": "repository_name",
"type": "string"
},
{
"id": 4,
- "name": "description",
+ "name": "repository_owner",
"type": "string"
},
{
"id": 5,
- "name": "project_id",
- "type": "string"
+ "name": "repository_type",
+ "type": "CodeReference.RepositoryType"
},
{
"id": 6,
- "name": "archived",
- "type": "bool"
+ "name": "repository_branch",
+ "type": "string"
},
{
"id": 7,
- "name": "created_at",
- "type": "int64"
+ "name": "cursor",
+ "type": "string"
},
{
"id": 8,
- "name": "updated_at",
+ "name": "page_size",
"type": "int64"
},
{
"id": 9,
- "name": "organization_id",
- "type": "string"
+ "name": "order_by",
+ "type": "OrderBy"
},
{
"id": 10,
- "name": "require_comment",
- "type": "bool"
+ "name": "order_direction",
+ "type": "OrderDirection"
},
{
"id": 11,
- "name": "feature_flag_count",
- "type": "int32"
+ "name": "file_extension",
+ "type": "string"
}
]
- }
- ],
- "package": {
- "name": "bucketeer.environment"
- },
- "options": [
+ },
{
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/environment"
- }
- ]
- }
- },
- {
- "protopath": "environment:/:organization.proto",
- "def": {
- "messages": [
+ "name": "ListCodeReferencesResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "code_references",
+ "type": "CodeReference",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "cursor",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "total_count",
+ "type": "int64"
+ }
+ ]
+ },
{
- "name": "Organization",
+ "name": "CreateCodeReferenceRequest",
"fields": [
{
"id": 1,
- "name": "id",
+ "name": "feature_id",
"type": "string"
},
{
"id": 2,
- "name": "name",
+ "name": "environment_id",
"type": "string"
},
{
"id": 3,
- "name": "url_code",
+ "name": "file_path",
"type": "string"
},
{
"id": 4,
- "name": "description",
- "type": "string"
+ "name": "line_number",
+ "type": "int32"
},
{
"id": 5,
- "name": "disabled",
- "type": "bool"
+ "name": "code_snippet",
+ "type": "string"
},
{
"id": 6,
- "name": "archived",
- "type": "bool"
+ "name": "content_hash",
+ "type": "string"
},
{
"id": 7,
- "name": "trial",
- "type": "bool"
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
},
{
"id": 8,
- "name": "created_at",
- "type": "int64"
+ "name": "repository_name",
+ "type": "string"
},
{
"id": 9,
- "name": "updated_at",
- "type": "int64"
+ "name": "repository_owner",
+ "type": "string"
},
{
"id": 10,
- "name": "system_admin",
- "type": "bool"
+ "name": "repository_type",
+ "type": "CodeReference.RepositoryType"
},
{
"id": 11,
- "name": "project_count",
- "type": "int32"
+ "name": "repository_branch",
+ "type": "string"
},
{
"id": 12,
- "name": "environment_count",
- "type": "int32"
- },
- {
- "id": 13,
- "name": "user_count",
- "type": "int32"
- },
- {
- "id": 14,
- "name": "owner_email",
+ "name": "commit_hash",
"type": "string"
}
]
- }
- ],
- "package": {
- "name": "bucketeer.environment"
- },
- "options": [
+ },
{
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/environment"
- }
- ]
- }
- },
- {
- "protopath": "environment:/:project.proto",
- "def": {
- "messages": [
+ "name": "CreateCodeReferenceResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "code_reference",
+ "type": "CodeReference"
+ }
+ ]
+ },
{
- "name": "Project",
+ "name": "UpdateCodeReferenceRequest",
"fields": [
{
"id": 1,
@@ -8360,173 +8285,1543 @@
},
{
"id": 2,
- "name": "description",
+ "name": "environment_id",
"type": "string"
},
{
"id": 3,
- "name": "disabled",
- "type": "bool"
+ "name": "file_path",
+ "type": "string"
},
{
"id": 4,
- "name": "trial",
- "type": "bool"
+ "name": "line_number",
+ "type": "int32"
},
{
"id": 5,
- "name": "creator_email",
+ "name": "code_snippet",
"type": "string"
},
{
"id": 6,
- "name": "created_at",
- "type": "int64"
+ "name": "content_hash",
+ "type": "string"
},
{
"id": 7,
- "name": "updated_at",
- "type": "int64"
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
},
{
"id": 8,
- "name": "name",
+ "name": "repository_name",
"type": "string"
},
{
"id": 9,
- "name": "url_code",
+ "name": "repository_owner",
"type": "string"
},
{
"id": 10,
- "name": "organization_id",
- "type": "string"
+ "name": "repository_type",
+ "type": "CodeReference.RepositoryType"
},
{
"id": 11,
- "name": "environment_count",
- "type": "int32"
+ "name": "repository_branch",
+ "type": "string"
},
{
"id": 12,
- "name": "feature_flag_count",
- "type": "int32"
- }
- ]
- }
- ],
- "package": {
- "name": "bucketeer.environment"
- },
- "options": [
- {
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/environment"
- }
- ]
- }
- },
- {
- "protopath": "environment:/:service.proto",
- "def": {
- "enums": [
- {
- "name": "ListEnvironmentsV2Request.OrderBy",
- "enum_fields": [
- {
- "name": "DEFAULT"
- },
- {
- "name": "ID",
- "integer": 1
- },
- {
- "name": "NAME",
- "integer": 2
- },
- {
- "name": "URL_CODE",
- "integer": 3
- },
- {
- "name": "CREATED_AT",
- "integer": 4
- },
- {
- "name": "UPDATED_AT",
- "integer": 5
- },
- {
- "name": "FEATURE_COUNT",
- "integer": 6
+ "name": "commit_hash",
+ "type": "string"
}
]
},
{
- "name": "ListEnvironmentsV2Request.OrderDirection",
- "enum_fields": [
- {
- "name": "ASC"
- },
+ "name": "UpdateCodeReferenceResponse",
+ "fields": [
{
- "name": "DESC",
- "integer": 1
+ "id": 1,
+ "name": "code_reference",
+ "type": "CodeReference"
}
]
},
{
- "name": "ListProjectsRequest.OrderBy",
- "enum_fields": [
- {
- "name": "DEFAULT"
- },
- {
- "name": "ID",
- "integer": 1
- },
- {
- "name": "CREATED_AT",
- "integer": 2
- },
- {
- "name": "UPDATED_AT",
- "integer": 3
- },
- {
- "name": "NAME",
- "integer": 4
- },
- {
- "name": "URL_CODE",
- "integer": 5
- },
- {
- "name": "ENVIRONMENT_COUNT",
- "integer": 6
- },
+ "name": "DeleteCodeReferenceRequest",
+ "fields": [
{
- "name": "FEATURE_COUNT",
- "integer": 7
+ "id": 1,
+ "name": "id",
+ "type": "string"
},
{
- "name": "CREATOR_EMAIL",
- "integer": 8
+ "id": 2,
+ "name": "environment_id",
+ "type": "string"
}
]
},
{
- "name": "ListProjectsRequest.OrderDirection",
- "enum_fields": [
- {
- "name": "ASC"
- },
- {
- "name": "DESC",
- "integer": 1
- }
- ]
- },
+ "name": "DeleteCodeReferenceResponse"
+ }
+ ],
+ "services": [
+ {
+ "name": "CodeReferenceService",
+ "rpcs": [
+ {
+ "name": "GetCodeReference",
+ "in_type": "GetCodeReferenceRequest",
+ "out_type": "GetCodeReferenceResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "get",
+ "value": "/v1/code_references/{id}"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get"
+ },
+ {
+ "name": "description",
+ "value": "Get a code reference by ID."
+ },
+ {
+ "name": "tags",
+ "value": "Code Reference"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.code_reference.get"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "403"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request does not have permission to access the resource."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":7,\"message\":\"not authorized\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "ListCodeReferences",
+ "in_type": "ListCodeReferencesRequest",
+ "out_type": "ListCodeReferencesResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "get",
+ "value": "/v1/code_references"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "List"
+ },
+ {
+ "name": "description",
+ "value": "List code references with optional filtering."
+ },
+ {
+ "name": "tags",
+ "value": "Code Reference"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.code_reference.list"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "CreateCodeReference",
+ "in_type": "CreateCodeReferenceRequest",
+ "out_type": "CreateCodeReferenceResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "post",
+ "value": "/v1/code_references"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Create"
+ },
+ {
+ "name": "description",
+ "value": "Create a new code reference. To call this API, you need a `WRITE` role."
+ },
+ {
+ "name": "tags",
+ "value": "Code Reference"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.code_reference.create"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "403"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request does not have permission to access the resource."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":7,\"message\":\"not authorized\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "UpdateCodeReference",
+ "in_type": "UpdateCodeReferenceRequest",
+ "out_type": "UpdateCodeReferenceResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "patch",
+ "value": "/v1/code_references/{id}"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Update"
+ },
+ {
+ "name": "description",
+ "value": "Update an existing code reference. To call this API, you need a `WRITE` role."
+ },
+ {
+ "name": "tags",
+ "value": "Code Reference"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.code_reference.update"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "403"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request does not have permission to access the resource."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":7,\"message\":\"not authorized\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "DeleteCodeReference",
+ "in_type": "DeleteCodeReferenceRequest",
+ "out_type": "DeleteCodeReferenceResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "delete",
+ "value": "/v1/code_references/{id}"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Delete"
+ },
+ {
+ "name": "description",
+ "value": "Delete a code reference. To call this API, you need a `WRITE` role."
+ },
+ {
+ "name": "tags",
+ "value": "Code Reference"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.code_reference.delete"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "403"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request does not have permission to access the resource."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":7,\"message\":\"not authorized\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "imports": [
+ {
+ "path": "proto/coderef/code_reference.proto"
+ },
+ {
+ "path": "google/api/annotations.proto"
+ },
+ {
+ "path": "protoc-gen-openapiv2/options/annotations.proto"
+ }
+ ],
+ "package": {
+ "name": "bucketeer.coderef"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/coderef"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "environment:/:command.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "CreateEnvironmentV2Command",
+ "fields": [
+ {
+ "id": 1,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "project_id",
+ "type": "string"
+ },
+ {
+ "id": 5,
+ "name": "require_comment",
+ "type": "bool"
+ }
+ ]
+ },
+ {
+ "name": "RenameEnvironmentV2Command",
+ "fields": [
+ {
+ "id": 1,
+ "name": "name",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeDescriptionEnvironmentV2Command",
+ "fields": [
+ {
+ "id": 1,
+ "name": "description",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ArchiveEnvironmentV2Command"
+ },
+ {
+ "name": "UnarchiveEnvironmentV2Command"
+ },
+ {
+ "name": "CreateProjectCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "organization_id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "url_code",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "CreateTrialProjectCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "name": "email",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 5,
+ "name": "owner_email",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "RenameProjectCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "name",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeDescriptionProjectCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "description",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "EnableProjectCommand"
+ },
+ {
+ "name": "DisableProjectCommand"
+ },
+ {
+ "name": "ConvertTrialProjectCommand"
+ },
+ {
+ "name": "CreateOrganizationCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "is_trial",
+ "type": "bool"
+ },
+ {
+ "id": 5,
+ "name": "is_system_admin",
+ "type": "bool"
+ },
+ {
+ "id": 6,
+ "name": "owner_email",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeNameOrganizationCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "name",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeDescriptionOrganizationCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "description",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeOwnerEmailOrganizationCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "owner_email",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "ChangeRequireCommentCommand",
+ "fields": [
+ {
+ "id": 1,
+ "name": "require_comment",
+ "type": "bool"
+ }
+ ]
+ },
+ {
+ "name": "EnableOrganizationCommand"
+ },
+ {
+ "name": "DisableOrganizationCommand"
+ },
+ {
+ "name": "ArchiveOrganizationCommand"
+ },
+ {
+ "name": "UnarchiveOrganizationCommand"
+ },
+ {
+ "name": "ConvertTrialOrganizationCommand"
+ }
+ ],
+ "package": {
+ "name": "bucketeer.environment"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/environment"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "environment:/:environment.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "EnvironmentV2",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 5,
+ "name": "project_id",
+ "type": "string"
+ },
+ {
+ "id": 6,
+ "name": "archived",
+ "type": "bool"
+ },
+ {
+ "id": 7,
+ "name": "created_at",
+ "type": "int64"
+ },
+ {
+ "id": 8,
+ "name": "updated_at",
+ "type": "int64"
+ },
+ {
+ "id": 9,
+ "name": "organization_id",
+ "type": "string"
+ },
+ {
+ "id": 10,
+ "name": "require_comment",
+ "type": "bool"
+ },
+ {
+ "id": 11,
+ "name": "feature_flag_count",
+ "type": "int32"
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.environment"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/environment"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "environment:/:organization.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "Organization",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 5,
+ "name": "disabled",
+ "type": "bool"
+ },
+ {
+ "id": 6,
+ "name": "archived",
+ "type": "bool"
+ },
+ {
+ "id": 7,
+ "name": "trial",
+ "type": "bool"
+ },
+ {
+ "id": 8,
+ "name": "created_at",
+ "type": "int64"
+ },
+ {
+ "id": 9,
+ "name": "updated_at",
+ "type": "int64"
+ },
+ {
+ "id": 10,
+ "name": "system_admin",
+ "type": "bool"
+ },
+ {
+ "id": 11,
+ "name": "project_count",
+ "type": "int32"
+ },
+ {
+ "id": 12,
+ "name": "environment_count",
+ "type": "int32"
+ },
+ {
+ "id": 13,
+ "name": "user_count",
+ "type": "int32"
+ },
+ {
+ "id": 14,
+ "name": "owner_email",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.environment"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/environment"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "environment:/:project.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "Project",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "disabled",
+ "type": "bool"
+ },
+ {
+ "id": 4,
+ "name": "trial",
+ "type": "bool"
+ },
+ {
+ "id": 5,
+ "name": "creator_email",
+ "type": "string"
+ },
+ {
+ "id": 6,
+ "name": "created_at",
+ "type": "int64"
+ },
+ {
+ "id": 7,
+ "name": "updated_at",
+ "type": "int64"
+ },
+ {
+ "id": 8,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 9,
+ "name": "url_code",
+ "type": "string"
+ },
+ {
+ "id": 10,
+ "name": "organization_id",
+ "type": "string"
+ },
+ {
+ "id": 11,
+ "name": "environment_count",
+ "type": "int32"
+ },
+ {
+ "id": 12,
+ "name": "feature_flag_count",
+ "type": "int32"
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.environment"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/environment"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "environment:/:service.proto",
+ "def": {
+ "enums": [
+ {
+ "name": "ListEnvironmentsV2Request.OrderBy",
+ "enum_fields": [
+ {
+ "name": "DEFAULT"
+ },
+ {
+ "name": "ID",
+ "integer": 1
+ },
+ {
+ "name": "NAME",
+ "integer": 2
+ },
+ {
+ "name": "URL_CODE",
+ "integer": 3
+ },
+ {
+ "name": "CREATED_AT",
+ "integer": 4
+ },
+ {
+ "name": "UPDATED_AT",
+ "integer": 5
+ },
+ {
+ "name": "FEATURE_COUNT",
+ "integer": 6
+ }
+ ]
+ },
+ {
+ "name": "ListEnvironmentsV2Request.OrderDirection",
+ "enum_fields": [
+ {
+ "name": "ASC"
+ },
+ {
+ "name": "DESC",
+ "integer": 1
+ }
+ ]
+ },
+ {
+ "name": "ListProjectsRequest.OrderBy",
+ "enum_fields": [
+ {
+ "name": "DEFAULT"
+ },
+ {
+ "name": "ID",
+ "integer": 1
+ },
+ {
+ "name": "CREATED_AT",
+ "integer": 2
+ },
+ {
+ "name": "UPDATED_AT",
+ "integer": 3
+ },
+ {
+ "name": "NAME",
+ "integer": 4
+ },
+ {
+ "name": "URL_CODE",
+ "integer": 5
+ },
+ {
+ "name": "ENVIRONMENT_COUNT",
+ "integer": 6
+ },
+ {
+ "name": "FEATURE_COUNT",
+ "integer": 7
+ },
+ {
+ "name": "CREATOR_EMAIL",
+ "integer": 8
+ }
+ ]
+ },
+ {
+ "name": "ListProjectsRequest.OrderDirection",
+ "enum_fields": [
+ {
+ "name": "ASC"
+ },
+ {
+ "name": "DESC",
+ "integer": 1
+ }
+ ]
+ },
{
"name": "ListOrganizationsRequest.OrderBy",
"enum_fields": [
@@ -14417,6 +15712,10 @@
{
"name": "TAG",
"integer": 17
+ },
+ {
+ "name": "CODEREF",
+ "integer": 18
}
],
"reserved_ids": [
@@ -14601,6 +15900,10 @@
"name": "GOAL_ARCHIVED",
"integer": 104
},
+ {
+ "name": "GOAL_UPDATED",
+ "integer": 105
+ },
{
"name": "EXPERIMENT_CREATED",
"integer": 200
@@ -15174,6 +16477,18 @@
{
"name": "TAG_DELETED",
"integer": 1702
+ },
+ {
+ "name": "CODE_REFERENCE_CREATED",
+ "integer": 1800
+ },
+ {
+ "name": "CODE_REFERENCE_UPDATED",
+ "integer": 1801
+ },
+ {
+ "name": "CODE_REFERENCE_DELETED",
+ "integer": 1802
}
],
"reserved_ids": [
@@ -16085,6 +17400,31 @@
"id": 6,
"name": "updated_at",
"type": "int64"
+ },
+ {
+ "id": 7,
+ "name": "connection_type",
+ "type": "bucketeer.experiment.Goal.ConnectionType"
+ }
+ ]
+ },
+ {
+ "name": "GoalUpdatedEvent",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "name",
+ "type": "google.protobuf.StringValue"
+ },
+ {
+ "id": 3,
+ "name": "description",
+ "type": "google.protobuf.StringValue"
}
]
},
@@ -18412,6 +19752,158 @@
"type": "string"
}
]
+ },
+ {
+ "name": "CodeReferenceCreatedEvent",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "feature_id",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "file_path",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "line_number",
+ "type": "int32"
+ },
+ {
+ "id": 5,
+ "name": "code_snippet",
+ "type": "string"
+ },
+ {
+ "id": 6,
+ "name": "content_hash",
+ "type": "string"
+ },
+ {
+ "id": 7,
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
+ },
+ {
+ "id": 8,
+ "name": "repository_name",
+ "type": "string"
+ },
+ {
+ "id": 9,
+ "name": "repository_owner",
+ "type": "string"
+ },
+ {
+ "id": 10,
+ "name": "repository_type",
+ "type": "bucketeer.coderef.CodeReference.RepositoryType"
+ },
+ {
+ "id": 11,
+ "name": "repository_branch",
+ "type": "string"
+ },
+ {
+ "id": 12,
+ "name": "commit_hash",
+ "type": "string"
+ },
+ {
+ "id": 13,
+ "name": "environment_id",
+ "type": "string"
+ },
+ {
+ "id": 14,
+ "name": "created_at",
+ "type": "int64"
+ },
+ {
+ "id": 15,
+ "name": "updated_at",
+ "type": "int64"
+ }
+ ]
+ },
+ {
+ "name": "CodeReferenceUpdatedEvent",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "file_path",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "line_number",
+ "type": "int32"
+ },
+ {
+ "id": 4,
+ "name": "code_snippet",
+ "type": "string"
+ },
+ {
+ "id": 5,
+ "name": "content_hash",
+ "type": "string"
+ },
+ {
+ "id": 6,
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
+ },
+ {
+ "id": 7,
+ "name": "repository_branch",
+ "type": "string"
+ },
+ {
+ "id": 8,
+ "name": "commit_hash",
+ "type": "string"
+ },
+ {
+ "id": 9,
+ "name": "environment_id",
+ "type": "string"
+ },
+ {
+ "id": 10,
+ "name": "updated_at",
+ "type": "int64"
+ }
+ ]
+ },
+ {
+ "name": "CodeReferenceDeletedEvent",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "environment_id",
+ "type": "string"
+ }
+ ]
}
],
"imports": [
@@ -18474,6 +19966,12 @@
},
{
"path": "proto/tag/tag.proto"
+ },
+ {
+ "path": "proto/experiment/goal.proto"
+ },
+ {
+ "path": "proto/coderef/code_reference.proto"
}
],
"package": {
@@ -20096,6 +21594,11 @@
"id": 3,
"name": "description",
"type": "string"
+ },
+ {
+ "id": 4,
+ "name": "connection_type",
+ "type": "Goal.ConnectionType"
}
]
},
@@ -20220,6 +21723,11 @@
"name": "FinishExperimentCommand"
}
],
+ "imports": [
+ {
+ "path": "proto/experiment/goal.proto"
+ }
+ ],
"package": {
"name": "bucketeer.experiment"
},
@@ -20374,10 +21882,33 @@
"id": 20,
"name": "archived",
"type": "bool"
+ },
+ {
+ "id": 21,
+ "name": "goals",
+ "type": "GoalReference",
+ "is_repeated": true
+ }
+ ],
+ "reserved_ids": [
+ 17
+ ],
+ "messages": [
+ {
+ "name": "GoalReference",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "name",
+ "type": "string"
+ }
+ ]
}
- ],
- "reserved_ids": [
- 17
]
},
{
@@ -20411,6 +21942,24 @@
{
"protopath": "experiment:/:goal.proto",
"def": {
+ "enums": [
+ {
+ "name": "Goal.ConnectionType",
+ "enum_fields": [
+ {
+ "name": "UNKNOWN"
+ },
+ {
+ "name": "EXPERIMENT",
+ "integer": 1
+ },
+ {
+ "name": "OPERATION",
+ "integer": 2
+ }
+ ]
+ }
+ ],
"messages": [
{
"name": "Goal",
@@ -20454,10 +22003,35 @@
"id": 8,
"name": "archived",
"type": "bool"
+ },
+ {
+ "id": 9,
+ "name": "connection_type",
+ "type": "ConnectionType"
+ },
+ {
+ "id": 10,
+ "name": "experiments",
+ "type": "Experiment",
+ "is_repeated": true
+ },
+ {
+ "id": 11,
+ "name": "auto_ops_rules",
+ "type": "autoops.AutoOpsRule",
+ "is_repeated": true
}
]
}
],
+ "imports": [
+ {
+ "path": "proto/experiment/experiment.proto"
+ },
+ {
+ "path": "proto/autoops/auto_ops_rule.proto"
+ }
+ ],
"package": {
"name": "bucketeer.experiment"
},
@@ -20490,6 +22064,10 @@
{
"name": "UPDATED_AT",
"integer": 3
+ },
+ {
+ "name": "CONNECTION_TYPE",
+ "integer": 4
}
]
},
@@ -20714,6 +22292,11 @@
"id": 6,
"name": "description",
"type": "string"
+ },
+ {
+ "id": 7,
+ "name": "connection_type",
+ "type": "Goal.ConnectionType"
}
],
"reserved_ids": [
@@ -20762,17 +22345,44 @@
{
"id": 1,
"name": "id",
- "type": "string"
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
},
{
"id": 2,
"name": "command",
- "type": "DeleteGoalCommand"
+ "type": "DeleteGoalCommand",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "deprecated"
+ }
+ ]
+ }
+ ]
},
{
"id": 4,
"name": "environment_id",
- "type": "string"
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
}
],
"reserved_ids": [
@@ -20788,22 +22398,90 @@
{
"id": 1,
"name": "id",
- "type": "string"
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
},
{
"id": 2,
"name": "rename_command",
- "type": "RenameGoalCommand"
+ "type": "RenameGoalCommand",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "deprecated"
+ }
+ ]
+ }
+ ]
},
{
"id": 3,
"name": "change_description_command",
- "type": "ChangeDescriptionGoalCommand"
+ "type": "ChangeDescriptionGoalCommand",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "deprecated"
+ }
+ ]
+ }
+ ]
},
{
"id": 5,
"name": "environment_id",
- "type": "string"
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
+ },
+ {
+ "id": 6,
+ "name": "name",
+ "type": "google.protobuf.StringValue"
+ },
+ {
+ "id": 7,
+ "name": "description",
+ "type": "google.protobuf.StringValue"
+ },
+ {
+ "id": 8,
+ "name": "archived",
+ "type": "google.protobuf.BoolValue",
+ "options": [
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "if true, the goal will be archived"
+ }
+ ]
+ }
+ ]
}
],
"reserved_ids": [
@@ -20811,7 +22489,14 @@
]
},
{
- "name": "UpdateGoalResponse"
+ "name": "UpdateGoalResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "goal",
+ "type": "Goal"
+ }
+ ]
},
{
"name": "GetExperimentRequest",
@@ -20913,7 +22598,13 @@
{
"id": 15,
"name": "environment_id",
- "type": "string"
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
}
],
"reserved_ids": [
@@ -20930,29 +22621,149 @@
"is_repeated": true
},
{
- "id": 2,
- "name": "cursor",
- "type": "string"
+ "id": 2,
+ "name": "cursor",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "total_count",
+ "type": "int64"
+ },
+ {
+ "id": 4,
+ "name": "summary",
+ "type": "Summary"
+ }
+ ],
+ "messages": [
+ {
+ "name": "Summary",
+ "fields": [
+ {
+ "id": 1,
+ "name": "total_waiting_count",
+ "type": "int64"
+ },
+ {
+ "id": 2,
+ "name": "total_running_count",
+ "type": "int64"
+ },
+ {
+ "id": 3,
+ "name": "total_stopped_count",
+ "type": "int64"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "CreateExperimentRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "command",
+ "type": "CreateExperimentCommand",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "deprecated"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "name": "environment_id",
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "name": "feature_id",
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "name": "start_at",
+ "type": "int64",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
+ },
+ {
+ "id": 6,
+ "name": "stop_at",
+ "type": "int64",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
+ },
+ {
+ "id": 7,
+ "name": "goal_ids",
+ "type": "string",
+ "is_repeated": true,
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
},
{
- "id": 3,
- "name": "total_count",
- "type": "int64"
- }
- ]
- },
- {
- "name": "CreateExperimentRequest",
- "fields": [
- {
- "id": 1,
- "name": "command",
- "type": "CreateExperimentCommand"
+ "id": 8,
+ "name": "name",
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
},
{
- "id": 3,
- "name": "environment_id",
+ "id": 9,
+ "name": "description",
"type": "string"
+ },
+ {
+ "id": 10,
+ "name": "base_variation_id",
+ "type": "string",
+ "options": [
+ {
+ "name": "(google.api.field_behavior)",
+ "value": "REQUIRED"
+ }
+ ]
}
],
"reserved_ids": [
@@ -21094,65 +22905,713 @@
"type": "string"
},
{
- "id": 2,
- "name": "command",
- "type": "ArchiveExperimentCommand"
+ "id": 2,
+ "name": "command",
+ "type": "ArchiveExperimentCommand"
+ },
+ {
+ "id": 4,
+ "name": "environment_id",
+ "type": "string"
+ }
+ ],
+ "reserved_ids": [
+ 3
+ ]
+ },
+ {
+ "name": "ArchiveExperimentResponse"
+ },
+ {
+ "name": "DeleteExperimentRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "command",
+ "type": "DeleteExperimentCommand"
+ },
+ {
+ "id": 4,
+ "name": "environment_id",
+ "type": "string"
+ }
+ ],
+ "reserved_ids": [
+ 3
+ ]
+ },
+ {
+ "name": "DeleteExperimentResponse"
+ }
+ ],
+ "services": [
+ {
+ "name": "ExperimentService",
+ "rpcs": [
+ {
+ "name": "GetGoal",
+ "in_type": "GetGoalRequest",
+ "out_type": "GetGoalResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "get",
+ "value": "/v1/goal"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get"
+ },
+ {
+ "name": "description",
+ "value": "Get a goal."
+ },
+ {
+ "name": "tags",
+ "value": "goal"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.goal.get"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "ListGoals",
+ "in_type": "ListGoalsRequest",
+ "out_type": "ListGoalsResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "get",
+ "value": "/v1/goals"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "List"
+ },
+ {
+ "name": "description",
+ "value": "List goals."
+ },
+ {
+ "name": "tags",
+ "value": "goal"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.goals.list"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "CreateGoal",
+ "in_type": "CreateGoalRequest",
+ "out_type": "CreateGoalResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "post",
+ "value": "/v1/goal"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Create"
+ },
+ {
+ "name": "description",
+ "value": "Create a goal."
+ },
+ {
+ "name": "tags",
+ "value": "goal"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.goal.create"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
},
{
- "id": 4,
- "name": "environment_id",
- "type": "string"
- }
- ],
- "reserved_ids": [
- 3
- ]
- },
- {
- "name": "ArchiveExperimentResponse"
- },
- {
- "name": "DeleteExperimentRequest",
- "fields": [
- {
- "id": 1,
- "name": "id",
- "type": "string"
+ "name": "UpdateGoal",
+ "in_type": "UpdateGoalRequest",
+ "out_type": "UpdateGoalResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "patch",
+ "value": "/v1/goal"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Update"
+ },
+ {
+ "name": "description",
+ "value": "Update a goal."
+ },
+ {
+ "name": "tags",
+ "value": "goal"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.goal.update"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
},
{
- "id": 2,
- "name": "command",
- "type": "DeleteExperimentCommand"
+ "name": "ArchiveGoal",
+ "in_type": "ArchiveGoalRequest",
+ "out_type": "ArchiveGoalResponse"
},
{
- "id": 4,
- "name": "environment_id",
- "type": "string"
- }
- ],
- "reserved_ids": [
- 3
- ]
- },
- {
- "name": "DeleteExperimentResponse"
- }
- ],
- "services": [
- {
- "name": "ExperimentService",
- "rpcs": [
+ "name": "DeleteGoal",
+ "in_type": "DeleteGoalRequest",
+ "out_type": "DeleteGoalResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "delete",
+ "value": "/v1/goal"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Delete"
+ },
+ {
+ "name": "description",
+ "value": "Delete a goal."
+ },
+ {
+ "name": "tags",
+ "value": "goal"
+ },
+ {
+ "name": "operation_id",
+ "value": "web.v1.goal.delete"
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "400"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Returned for bad requests that may have failed validation."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":3,\"message\":\"invalid arguments error\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "responses",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "401"
+ },
+ {
+ "name": "value",
+ "aggregated": [
+ {
+ "name": "description",
+ "value": "Request could not be authenticated (authentication required)."
+ },
+ {
+ "name": "schema",
+ "aggregated": [
+ {
+ "name": "json_schema",
+ "aggregated": [
+ {
+ "name": "ref",
+ "value": ".google.rpc.Status"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "examples",
+ "aggregated": [
+ {
+ "name": "key",
+ "value": "application/json"
+ },
+ {
+ "name": "value",
+ "value": "{\"code\":16,\"message\":\"not authenticated\",\"details\":[]}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
{
- "name": "GetGoal",
- "in_type": "GetGoalRequest",
- "out_type": "GetGoalResponse",
+ "name": "GetExperiment",
+ "in_type": "GetExperimentRequest",
+ "out_type": "GetExperimentResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/v1/goal"
+ "value": "/v1/experiment"
}
]
},
@@ -21165,15 +23624,15 @@
},
{
"name": "description",
- "value": "Get a goal."
+ "value": "Get an experiment."
},
{
"name": "tags",
- "value": "goal"
+ "value": "experiment"
},
{
"name": "operation_id",
- "value": "web.v1.goal.get"
+ "value": "web.v1.experiment.get"
},
{
"name": "responses",
@@ -21270,16 +23729,16 @@
]
},
{
- "name": "ListGoals",
- "in_type": "ListGoalsRequest",
- "out_type": "ListGoalsResponse",
+ "name": "ListExperiments",
+ "in_type": "ListExperimentsRequest",
+ "out_type": "ListExperimentsResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/v1/goals"
+ "value": "/v1/experiments"
}
]
},
@@ -21292,15 +23751,15 @@
},
{
"name": "description",
- "value": "List goals."
+ "value": "List experiments."
},
{
"name": "tags",
- "value": "goal"
+ "value": "experiment"
},
{
"name": "operation_id",
- "value": "web.v1.goals.list"
+ "value": "web.v1.experiment.list"
},
{
"name": "responses",
@@ -21397,16 +23856,16 @@
]
},
{
- "name": "CreateGoal",
- "in_type": "CreateGoalRequest",
- "out_type": "CreateGoalResponse",
+ "name": "CreateExperiment",
+ "in_type": "CreateExperimentRequest",
+ "out_type": "CreateExperimentResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "post",
- "value": "/v1/goal"
+ "value": "/v1/experiment"
},
{
"name": "body",
@@ -21423,15 +23882,15 @@
},
{
"name": "description",
- "value": "Create a goal."
+ "value": "Create an experiment."
},
{
"name": "tags",
- "value": "goal"
+ "value": "experiment"
},
{
"name": "operation_id",
- "value": "web.v1.goal.create"
+ "value": "web.v1.experiment.create"
},
{
"name": "responses",
@@ -21527,36 +23986,6 @@
}
]
},
- {
- "name": "UpdateGoal",
- "in_type": "UpdateGoalRequest",
- "out_type": "UpdateGoalResponse"
- },
- {
- "name": "ArchiveGoal",
- "in_type": "ArchiveGoalRequest",
- "out_type": "ArchiveGoalResponse"
- },
- {
- "name": "DeleteGoal",
- "in_type": "DeleteGoalRequest",
- "out_type": "DeleteGoalResponse"
- },
- {
- "name": "GetExperiment",
- "in_type": "GetExperimentRequest",
- "out_type": "GetExperimentResponse"
- },
- {
- "name": "ListExperiments",
- "in_type": "ListExperimentsRequest",
- "out_type": "ListExperimentsResponse"
- },
- {
- "name": "CreateExperiment",
- "in_type": "CreateExperimentRequest",
- "out_type": "CreateExperimentResponse"
- },
{
"name": "UpdateExperiment",
"in_type": "UpdateExperimentRequest",
@@ -26161,512 +28590,863 @@
"def": {
"enums": [
{
- "name": "Strategy.Type",
- "enum_fields": [
+ "name": "Strategy.Type",
+ "enum_fields": [
+ {
+ "name": "FIXED"
+ },
+ {
+ "name": "ROLLOUT",
+ "integer": 1
+ }
+ ]
+ }
+ ],
+ "messages": [
+ {
+ "name": "FixedStrategy",
+ "fields": [
+ {
+ "id": 1,
+ "name": "variation",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "RolloutStrategy",
+ "fields": [
+ {
+ "id": 1,
+ "name": "variations",
+ "type": "Variation",
+ "is_repeated": true
+ }
+ ],
+ "messages": [
+ {
+ "name": "Variation",
+ "fields": [
+ {
+ "id": 1,
+ "name": "variation",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "weight",
+ "type": "int32"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Strategy",
+ "fields": [
+ {
+ "id": 1,
+ "name": "type",
+ "type": "Type"
+ },
+ {
+ "id": 2,
+ "name": "fixed_strategy",
+ "type": "FixedStrategy"
+ },
+ {
+ "id": 3,
+ "name": "rollout_strategy",
+ "type": "RolloutStrategy"
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.feature"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/feature"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "feature:/:target.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "Target",
+ "fields": [
+ {
+ "id": 1,
+ "name": "variation",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "users",
+ "type": "string",
+ "is_repeated": true
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.feature"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/feature"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "feature:/:variation.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "Variation",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "description",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "package": {
+ "name": "bucketeer.feature"
+ },
+ "options": [
+ {
+ "name": "go_package",
+ "value": "github.com/bucketeer-io/bucketeer/proto/feature"
+ }
+ ]
+ }
+ },
+ {
+ "protopath": "gateway:/:service.proto",
+ "def": {
+ "messages": [
+ {
+ "name": "PingRequest"
+ },
+ {
+ "name": "PingResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "time",
+ "type": "int64"
+ }
+ ]
+ },
+ {
+ "name": "GetFeatureFlagsRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "tag",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "feature_flags_id",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "requested_at",
+ "type": "int64"
+ },
+ {
+ "id": 4,
+ "name": "source_id",
+ "type": "bucketeer.event.client.SourceId"
+ },
+ {
+ "id": 5,
+ "name": "sdk_version",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "GetFeatureFlagsResponse",
+ "fields": [
{
- "name": "FIXED"
+ "id": 1,
+ "name": "feature_flags_id",
+ "type": "string"
},
{
- "name": "ROLLOUT",
- "integer": 1
+ "id": 2,
+ "name": "features",
+ "type": "bucketeer.feature.Feature",
+ "is_repeated": true
+ },
+ {
+ "id": 3,
+ "name": "archived_feature_flag_ids",
+ "type": "string",
+ "is_repeated": true
+ },
+ {
+ "id": 4,
+ "name": "requested_at",
+ "type": "int64"
+ },
+ {
+ "id": 5,
+ "name": "force_update",
+ "type": "bool"
}
]
- }
- ],
- "messages": [
+ },
{
- "name": "FixedStrategy",
+ "name": "GetSegmentUsersRequest",
"fields": [
{
"id": 1,
- "name": "variation",
+ "name": "segment_ids",
+ "type": "string",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "requested_at",
+ "type": "int64"
+ },
+ {
+ "id": 3,
+ "name": "source_id",
+ "type": "bucketeer.event.client.SourceId"
+ },
+ {
+ "id": 4,
+ "name": "sdk_version",
"type": "string"
}
]
},
{
- "name": "RolloutStrategy",
+ "name": "GetSegmentUsersResponse",
"fields": [
{
"id": 1,
- "name": "variations",
- "type": "Variation",
+ "name": "segment_users",
+ "type": "bucketeer.feature.SegmentUsers",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "deleted_segment_ids",
+ "type": "string",
"is_repeated": true
+ },
+ {
+ "id": 3,
+ "name": "requested_at",
+ "type": "int64"
+ },
+ {
+ "id": 4,
+ "name": "force_update",
+ "type": "bool"
+ }
+ ]
+ },
+ {
+ "name": "GetEvaluationsRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "tag",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "user",
+ "type": "user.User"
+ },
+ {
+ "id": 3,
+ "name": "user_evaluations_id",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "feature_id",
+ "type": "string",
+ "options": [
+ {
+ "name": "deprecated",
+ "value": "true"
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "name": "source_id",
+ "type": "bucketeer.event.client.SourceId"
+ },
+ {
+ "id": 6,
+ "name": "user_evaluation_condition",
+ "type": "UserEvaluationCondition"
+ },
+ {
+ "id": 7,
+ "name": "sdk_version",
+ "type": "string"
}
],
"messages": [
{
- "name": "Variation",
+ "name": "UserEvaluationCondition",
"fields": [
{
"id": 1,
- "name": "variation",
- "type": "string"
+ "name": "evaluated_at",
+ "type": "int64"
},
{
"id": 2,
- "name": "weight",
- "type": "int32"
+ "name": "user_attributes_updated",
+ "type": "bool"
}
]
}
]
},
{
- "name": "Strategy",
+ "name": "GetEvaluationsResponse",
"fields": [
{
"id": 1,
- "name": "type",
- "type": "Type"
+ "name": "state",
+ "type": "feature.UserEvaluations.State"
},
{
"id": 2,
- "name": "fixed_strategy",
- "type": "FixedStrategy"
+ "name": "evaluations",
+ "type": "feature.UserEvaluations"
},
{
"id": 3,
- "name": "rollout_strategy",
- "type": "RolloutStrategy"
+ "name": "user_evaluations_id",
+ "type": "string"
}
]
- }
- ],
- "package": {
- "name": "bucketeer.feature"
- },
- "options": [
- {
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/feature"
- }
- ]
- }
- },
- {
- "protopath": "feature:/:target.proto",
- "def": {
- "messages": [
+ },
{
- "name": "Target",
+ "name": "GetEvaluationRequest",
"fields": [
{
"id": 1,
- "name": "variation",
+ "name": "tag",
"type": "string"
},
{
"id": 2,
- "name": "users",
- "type": "string",
+ "name": "user",
+ "type": "user.User"
+ },
+ {
+ "id": 3,
+ "name": "feature_id",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "source_id",
+ "type": "bucketeer.event.client.SourceId"
+ },
+ {
+ "id": 5,
+ "name": "sdk_version",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "GetEvaluationResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "evaluation",
+ "type": "feature.Evaluation"
+ }
+ ]
+ },
+ {
+ "name": "RegisterEventsRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "events",
+ "type": "bucketeer.event.client.Event",
"is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "sdk_version",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "source_id",
+ "type": "bucketeer.event.client.SourceId"
+ }
+ ]
+ },
+ {
+ "name": "RegisterEventsResponse",
+ "maps": [
+ {
+ "key_type": "string",
+ "field": {
+ "id": 1,
+ "name": "errors",
+ "type": "Error"
+ }
+ }
+ ],
+ "messages": [
+ {
+ "name": "Error",
+ "fields": [
+ {
+ "id": 1,
+ "name": "retriable",
+ "type": "bool"
+ },
+ {
+ "id": 2,
+ "name": "message",
+ "type": "string"
+ }
+ ]
}
]
- }
- ],
- "package": {
- "name": "bucketeer.feature"
- },
- "options": [
- {
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/feature"
- }
- ]
- }
- },
- {
- "protopath": "feature:/:variation.proto",
- "def": {
- "messages": [
+ },
{
- "name": "Variation",
+ "name": "TrackRequest",
"fields": [
{
"id": 1,
- "name": "id",
+ "name": "apikey",
"type": "string"
},
{
"id": 2,
- "name": "value",
+ "name": "userid",
"type": "string"
},
{
"id": 3,
- "name": "name",
+ "name": "goalid",
"type": "string"
},
{
"id": 4,
- "name": "description",
+ "name": "tag",
"type": "string"
- }
- ]
- }
- ],
- "package": {
- "name": "bucketeer.feature"
- },
- "options": [
- {
- "name": "go_package",
- "value": "github.com/bucketeer-io/bucketeer/proto/feature"
- }
- ]
- }
- },
- {
- "protopath": "gateway:/:service.proto",
- "def": {
- "messages": [
- {
- "name": "PingRequest"
- },
- {
- "name": "PingResponse",
- "fields": [
+ },
{
- "id": 1,
- "name": "time",
+ "id": 5,
+ "name": "timestamp",
"type": "int64"
+ },
+ {
+ "id": 6,
+ "name": "value",
+ "type": "double"
}
]
},
{
- "name": "GetFeatureFlagsRequest",
+ "name": "TrackResponse"
+ },
+ {
+ "name": "CreateFeatureRequest",
"fields": [
{
"id": 1,
- "name": "tag",
+ "name": "id",
"type": "string"
},
{
"id": 2,
- "name": "feature_flags_id",
+ "name": "name",
"type": "string"
},
{
"id": 3,
- "name": "requested_at",
- "type": "int64"
+ "name": "description",
+ "type": "string"
},
{
"id": 4,
- "name": "source_id",
- "type": "bucketeer.event.client.SourceId"
+ "name": "variation_type",
+ "type": "feature.Feature.VariationType"
},
{
"id": 5,
- "name": "sdk_version",
- "type": "string"
- }
- ]
- },
- {
- "name": "GetFeatureFlagsResponse",
- "fields": [
- {
- "id": 1,
- "name": "feature_flags_id",
- "type": "string"
- },
- {
- "id": 2,
- "name": "features",
- "type": "bucketeer.feature.Feature",
+ "name": "variations",
+ "type": "feature.Variation",
"is_repeated": true
},
{
- "id": 3,
- "name": "archived_feature_flag_ids",
+ "id": 6,
+ "name": "tags",
"type": "string",
"is_repeated": true
},
{
- "id": 4,
- "name": "requested_at",
- "type": "int64"
+ "id": 7,
+ "name": "on_variation_index",
+ "type": "int32"
},
{
- "id": 5,
- "name": "force_update",
- "type": "bool"
+ "id": 8,
+ "name": "off_variation_index",
+ "type": "int32"
}
]
},
{
- "name": "GetSegmentUsersRequest",
+ "name": "CreateFeatureResponse",
"fields": [
{
"id": 1,
- "name": "segment_ids",
- "type": "string",
- "is_repeated": true
- },
- {
- "id": 2,
- "name": "requested_at",
- "type": "int64"
- },
- {
- "id": 3,
- "name": "source_id",
- "type": "bucketeer.event.client.SourceId"
- },
+ "name": "feature",
+ "type": "feature.Feature"
+ }
+ ]
+ },
+ {
+ "name": "GetFeatureRequest",
+ "fields": [
{
- "id": 4,
- "name": "sdk_version",
+ "id": 1,
+ "name": "id",
"type": "string"
}
]
},
{
- "name": "GetSegmentUsersResponse",
+ "name": "GetFeatureResponse",
"fields": [
{
"id": 1,
- "name": "segment_users",
- "type": "bucketeer.feature.SegmentUsers",
- "is_repeated": true
+ "name": "feature",
+ "type": "feature.Feature"
+ }
+ ]
+ },
+ {
+ "name": "ListFeaturesRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "page_size",
+ "type": "int64"
},
{
"id": 2,
- "name": "deleted_segment_ids",
- "type": "string",
- "is_repeated": true
+ "name": "cursor",
+ "type": "string"
},
{
"id": 3,
- "name": "requested_at",
- "type": "int64"
+ "name": "order_by",
+ "type": "feature.ListFeaturesRequest.OrderBy"
},
{
"id": 4,
- "name": "force_update",
- "type": "bool"
+ "name": "order_direction",
+ "type": "feature.ListFeaturesRequest.OrderDirection"
}
]
},
{
- "name": "GetEvaluationsRequest",
+ "name": "ListFeaturesResponse",
"fields": [
{
"id": 1,
- "name": "tag",
+ "name": "features",
+ "type": "feature.Feature",
+ "is_repeated": true
+ }
+ ]
+ },
+ {
+ "name": "UpdateFeatureRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "comment",
"type": "string"
},
{
"id": 2,
- "name": "user",
- "type": "user.User"
+ "name": "id",
+ "type": "string"
},
{
"id": 3,
- "name": "user_evaluations_id",
- "type": "string"
+ "name": "name",
+ "type": "google.protobuf.StringValue"
},
{
"id": 4,
- "name": "feature_id",
- "type": "string",
- "options": [
- {
- "name": "deprecated",
- "value": "true"
- }
- ]
+ "name": "description",
+ "type": "google.protobuf.StringValue"
},
{
"id": 5,
- "name": "source_id",
- "type": "bucketeer.event.client.SourceId"
+ "name": "tags",
+ "type": "string",
+ "is_repeated": true
},
{
"id": 6,
- "name": "user_evaluation_condition",
- "type": "UserEvaluationCondition"
+ "name": "enabled",
+ "type": "google.protobuf.BoolValue"
},
{
"id": 7,
- "name": "sdk_version",
- "type": "string"
- }
- ],
- "messages": [
+ "name": "archived",
+ "type": "google.protobuf.BoolValue"
+ },
+ {
+ "id": 8,
+ "name": "variations",
+ "type": "feature.Variation",
+ "is_repeated": true
+ },
+ {
+ "id": 9,
+ "name": "prerequisites",
+ "type": "feature.Prerequisite",
+ "is_repeated": true
+ },
+ {
+ "id": 10,
+ "name": "targets",
+ "type": "feature.Target",
+ "is_repeated": true
+ },
+ {
+ "id": 11,
+ "name": "rules",
+ "type": "feature.Rule",
+ "is_repeated": true
+ },
+ {
+ "id": 12,
+ "name": "default_strategy",
+ "type": "feature.Strategy"
+ },
{
- "name": "UserEvaluationCondition",
- "fields": [
- {
- "id": 1,
- "name": "evaluated_at",
- "type": "int64"
- },
- {
- "id": 2,
- "name": "user_attributes_updated",
- "type": "bool"
- }
- ]
+ "id": 13,
+ "name": "off_variation",
+ "type": "google.protobuf.StringValue"
}
]
},
{
- "name": "GetEvaluationsResponse",
+ "name": "UpdateFeatureResponse",
"fields": [
{
"id": 1,
- "name": "state",
- "type": "feature.UserEvaluations.State"
- },
- {
- "id": 2,
- "name": "evaluations",
- "type": "feature.UserEvaluations"
- },
- {
- "id": 3,
- "name": "user_evaluations_id",
- "type": "string"
+ "name": "feature",
+ "type": "feature.Feature"
}
]
},
{
- "name": "GetEvaluationRequest",
+ "name": "ListPushesRequest",
"fields": [
{
"id": 1,
- "name": "tag",
- "type": "string"
+ "name": "page_size",
+ "type": "int64"
},
{
"id": 2,
- "name": "user",
- "type": "user.User"
+ "name": "cursor",
+ "type": "string"
},
{
"id": 3,
- "name": "feature_id",
- "type": "string"
+ "name": "order_by",
+ "type": "push.ListPushesRequest.OrderBy"
},
{
"id": 4,
- "name": "source_id",
- "type": "bucketeer.event.client.SourceId"
+ "name": "order_direction",
+ "type": "push.ListPushesRequest.OrderDirection"
},
{
"id": 5,
- "name": "sdk_version",
+ "name": "search_keyword",
"type": "string"
}
]
},
{
- "name": "GetEvaluationResponse",
+ "name": "ListPushesResponse",
"fields": [
{
"id": 1,
- "name": "evaluation",
- "type": "feature.Evaluation"
+ "name": "pushes",
+ "type": "push.Push",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "cursor",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "total_count",
+ "type": "int64"
}
]
},
{
- "name": "RegisterEventsRequest",
+ "name": "CreatePushRequest",
"fields": [
{
"id": 1,
- "name": "events",
- "type": "bucketeer.event.client.Event",
+ "name": "tags",
+ "type": "string",
"is_repeated": true
},
{
"id": 2,
- "name": "sdk_version",
+ "name": "name",
"type": "string"
},
{
"id": 3,
- "name": "source_id",
- "type": "bucketeer.event.client.SourceId"
+ "name": "fcm_service_account",
+ "type": "bytes"
}
]
},
{
- "name": "RegisterEventsResponse",
- "maps": [
+ "name": "CreatePushResponse",
+ "fields": [
{
- "key_type": "string",
- "field": {
- "id": 1,
- "name": "errors",
- "type": "Error"
- }
+ "id": 1,
+ "name": "push",
+ "type": "push.Push"
}
- ],
- "messages": [
+ ]
+ },
+ {
+ "name": "GetPushRequest",
+ "fields": [
{
- "name": "Error",
- "fields": [
- {
- "id": 1,
- "name": "retriable",
- "type": "bool"
- },
- {
- "id": 2,
- "name": "message",
- "type": "string"
- }
- ]
+ "id": 1,
+ "name": "id",
+ "type": "string"
}
]
},
{
- "name": "TrackRequest",
+ "name": "GetPushResponse",
"fields": [
{
"id": 1,
- "name": "apikey",
+ "name": "push",
+ "type": "push.Push"
+ }
+ ]
+ },
+ {
+ "name": "UpdatePushRequest",
+ "fields": [
+ {
+ "id": 1,
+ "name": "id",
"type": "string"
},
{
"id": 2,
- "name": "userid",
- "type": "string"
+ "name": "tags",
+ "type": "string",
+ "is_repeated": true
},
{
"id": 3,
- "name": "goalid",
- "type": "string"
+ "name": "name",
+ "type": "google.protobuf.StringValue"
},
{
"id": 4,
- "name": "tag",
- "type": "string"
- },
- {
- "id": 5,
- "name": "timestamp",
- "type": "int64"
- },
- {
- "id": 6,
- "name": "value",
- "type": "double"
+ "name": "deleted",
+ "type": "google.protobuf.BoolValue",
+ "options": [
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "title",
+ "value": "deleted"
+ },
+ {
+ "name": "description",
+ "value": "if true, the push notification will be deleted and other fields will be ignored."
+ }
+ ]
+ }
+ ]
}
]
},
{
- "name": "TrackResponse"
+ "name": "UpdatePushResponse",
+ "fields": [
+ {
+ "id": 1,
+ "name": "push",
+ "type": "push.Push"
+ }
+ ]
},
{
- "name": "CreateFeatureRequest",
+ "name": "CreateAccountV2Request",
"fields": [
{
"id": 1,
- "name": "id",
+ "name": "email",
"type": "string"
},
{
@@ -26676,115 +29456,63 @@
},
{
"id": 3,
- "name": "description",
+ "name": "avatar_image_url",
"type": "string"
},
{
"id": 4,
- "name": "variation_type",
- "type": "feature.Feature.VariationType"
+ "name": "organization_id",
+ "type": "string"
},
{
"id": 5,
- "name": "variations",
- "type": "feature.Variation",
- "is_repeated": true
+ "name": "organization_role",
+ "type": "account.AccountV2.Role.Organization"
},
{
"id": 6,
- "name": "tags",
- "type": "string",
+ "name": "environment_roles",
+ "type": "account.AccountV2.EnvironmentRole",
"is_repeated": true
},
{
"id": 7,
- "name": "on_variation_index",
- "type": "int32"
- },
- {
- "id": 8,
- "name": "off_variation_index",
- "type": "int32"
- }
- ]
- },
- {
- "name": "CreateFeatureResponse",
- "fields": [
- {
- "id": 1,
- "name": "feature",
- "type": "feature.Feature"
- }
- ]
- },
- {
- "name": "GetFeatureRequest",
- "fields": [
- {
- "id": 1,
- "name": "id",
- "type": "string"
- }
- ]
- },
- {
- "name": "GetFeatureResponse",
- "fields": [
- {
- "id": 1,
- "name": "feature",
- "type": "feature.Feature"
- }
- ]
- },
- {
- "name": "ListFeaturesRequest",
- "fields": [
- {
- "id": 1,
- "name": "page_size",
- "type": "int64"
- },
- {
- "id": 2,
- "name": "cursor",
+ "name": "first_name",
"type": "string"
},
{
- "id": 3,
- "name": "order_by",
- "type": "feature.ListFeaturesRequest.OrderBy"
+ "id": 8,
+ "name": "last_name",
+ "type": "string"
},
{
- "id": 4,
- "name": "order_direction",
- "type": "feature.ListFeaturesRequest.OrderDirection"
+ "id": 9,
+ "name": "language",
+ "type": "string"
}
]
},
{
- "name": "ListFeaturesResponse",
+ "name": "CreateAccountV2Response",
"fields": [
{
"id": 1,
- "name": "features",
- "type": "feature.Feature",
- "is_repeated": true
+ "name": "account",
+ "type": "account.AccountV2"
}
]
},
{
- "name": "UpdateFeatureRequest",
+ "name": "UpdateAccountV2Request",
"fields": [
{
"id": 1,
- "name": "comment",
+ "name": "email",
"type": "string"
},
{
"id": 2,
- "name": "id",
+ "name": "organization_id",
"type": "string"
},
{
@@ -26794,155 +29522,245 @@
},
{
"id": 4,
- "name": "description",
+ "name": "avatar_image_url",
"type": "google.protobuf.StringValue"
},
{
"id": 5,
- "name": "tags",
- "type": "string",
- "is_repeated": true
+ "name": "organization_role",
+ "type": "account.UpdateAccountV2Request.OrganizationRoleValue"
},
{
"id": 6,
- "name": "enabled",
- "type": "google.protobuf.BoolValue"
+ "name": "environment_roles",
+ "type": "account.AccountV2.EnvironmentRole",
+ "is_repeated": true
},
{
"id": 7,
- "name": "archived",
- "type": "google.protobuf.BoolValue"
+ "name": "first_name",
+ "type": "google.protobuf.StringValue"
},
{
"id": 8,
- "name": "variations",
- "type": "feature.Variation",
- "is_repeated": true
+ "name": "last_name",
+ "type": "google.protobuf.StringValue"
},
{
"id": 9,
- "name": "prerequisites",
- "type": "feature.Prerequisite",
- "is_repeated": true
+ "name": "language",
+ "type": "google.protobuf.StringValue"
},
{
"id": 10,
- "name": "targets",
- "type": "feature.Target",
- "is_repeated": true
+ "name": "last_seen",
+ "type": "google.protobuf.Int64Value"
},
{
"id": 11,
- "name": "rules",
- "type": "feature.Rule",
- "is_repeated": true
+ "name": "avatar",
+ "type": "account.UpdateAccountV2Request.AccountV2Avatar"
},
{
"id": 12,
- "name": "default_strategy",
- "type": "feature.Strategy"
+ "name": "disabled",
+ "type": "google.protobuf.BoolValue",
+ "options": [
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "title",
+ "value": "disabled"
+ },
+ {
+ "name": "description",
+ "value": "if disabled is true, the account will be disabled. If false, the account will be enabled."
+ }
+ ]
+ }
+ ]
},
{
"id": 13,
- "name": "off_variation",
- "type": "google.protobuf.StringValue"
+ "name": "deleted",
+ "type": "google.protobuf.BoolValue",
+ "options": [
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "aggregated": [
+ {
+ "name": "title",
+ "value": "deleted"
+ },
+ {
+ "name": "description",
+ "value": "if true, the account will be deleted and other fields will be ignored."
+ }
+ ]
+ }
+ ]
}
]
},
{
- "name": "UpdateFeatureResponse",
+ "name": "UpdateAccountV2Response",
"fields": [
{
"id": 1,
- "name": "feature",
- "type": "feature.Feature"
+ "name": "account",
+ "type": "account.AccountV2"
}
]
},
{
- "name": "ListPushesRequest",
+ "name": "GetAccountV2Request",
"fields": [
{
"id": 1,
- "name": "page_size",
- "type": "int64"
+ "name": "email",
+ "type": "string"
},
{
"id": 2,
- "name": "cursor",
+ "name": "organization_id",
"type": "string"
- },
+ }
+ ]
+ },
+ {
+ "name": "GetAccountV2Response",
+ "fields": [
{
- "id": 3,
- "name": "order_by",
- "type": "push.ListPushesRequest.OrderBy"
- },
+ "id": 1,
+ "name": "account",
+ "type": "account.AccountV2"
+ }
+ ]
+ },
+ {
+ "name": "GetAccountV2ByEnvironmentIDRequest",
+ "fields": [
{
- "id": 4,
- "name": "order_direction",
- "type": "push.ListPushesRequest.OrderDirection"
+ "id": 1,
+ "name": "email",
+ "type": "string"
},
{
- "id": 5,
- "name": "search_keyword",
+ "id": 2,
+ "name": "environment_id",
"type": "string"
}
]
},
{
- "name": "ListPushesResponse",
+ "name": "GetAccountV2ByEnvironmentIDResponse",
"fields": [
{
"id": 1,
- "name": "pushes",
- "type": "push.Push",
- "is_repeated": true
- },
+ "name": "account",
+ "type": "account.AccountV2"
+ }
+ ]
+ },
+ {
+ "name": "GetMeRequest",
+ "fields": [
{
- "id": 2,
- "name": "cursor",
+ "id": 1,
+ "name": "organization_id",
"type": "string"
- },
+ }
+ ]
+ },
+ {
+ "name": "GetMeResponse",
+ "fields": [
{
- "id": 3,
- "name": "total_count",
- "type": "int64"
+ "id": 1,
+ "name": "account",
+ "type": "account.ConsoleAccount"
}
]
},
{
- "name": "CreatePushRequest",
+ "name": "ListAccountsV2Request",
"fields": [
{
"id": 1,
- "name": "tags",
- "type": "string",
- "is_repeated": true
+ "name": "page_size",
+ "type": "int64"
},
{
"id": 2,
- "name": "name",
+ "name": "cursor",
"type": "string"
},
{
"id": 3,
- "name": "fcm_service_account",
- "type": "bytes"
+ "name": "organization_id",
+ "type": "string"
+ },
+ {
+ "id": 4,
+ "name": "order_by",
+ "type": "account.ListAccountsV2Request.OrderBy"
+ },
+ {
+ "id": 5,
+ "name": "order_direction",
+ "type": "account.ListAccountsV2Request.OrderDirection"
+ },
+ {
+ "id": 6,
+ "name": "search_keyword",
+ "type": "string"
+ },
+ {
+ "id": 7,
+ "name": "disabled",
+ "type": "google.protobuf.BoolValue"
+ },
+ {
+ "id": 8,
+ "name": "organization_role",
+ "type": "google.protobuf.Int32Value"
+ },
+ {
+ "id": 9,
+ "name": "environment_id",
+ "type": "google.protobuf.StringValue"
+ },
+ {
+ "id": 10,
+ "name": "environment_role",
+ "type": "google.protobuf.Int32Value"
}
]
},
{
- "name": "CreatePushResponse",
+ "name": "ListAccountsV2Response",
"fields": [
{
"id": 1,
- "name": "push",
- "type": "push.Push"
+ "name": "accounts",
+ "type": "account.AccountV2",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "cursor",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "total_count",
+ "type": "int64"
}
]
},
{
- "name": "GetPushRequest",
+ "name": "GetCodeReferenceRequest",
"fields": [
{
"id": 1,
@@ -26952,400 +29770,500 @@
]
},
{
- "name": "GetPushResponse",
+ "name": "GetCodeReferenceResponse",
"fields": [
{
"id": 1,
- "name": "push",
- "type": "push.Push"
+ "name": "code_reference",
+ "type": "bucketeer.coderef.CodeReference"
}
]
},
{
- "name": "UpdatePushRequest",
+ "name": "ListCodeReferencesRequest",
"fields": [
{
"id": 1,
- "name": "id",
- "type": "string"
+ "name": "page_size",
+ "type": "int64"
},
{
"id": 2,
- "name": "tags",
- "type": "string",
- "is_repeated": true
+ "name": "cursor",
+ "type": "string"
},
{
"id": 3,
- "name": "name",
- "type": "google.protobuf.StringValue"
+ "name": "order_by",
+ "type": "bucketeer.coderef.ListCodeReferencesRequest.OrderBy"
+ },
+ {
+ "id": 4,
+ "name": "order_direction",
+ "type": "bucketeer.coderef.ListCodeReferencesRequest.OrderDirection"
+ },
+ {
+ "id": 5,
+ "name": "search_keyword",
+ "type": "string"
},
{
- "id": 4,
- "name": "deleted",
- "type": "google.protobuf.BoolValue",
- "options": [
- {
- "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
- "aggregated": [
- {
- "name": "title",
- "value": "deleted"
- },
- {
- "name": "description",
- "value": "if true, the push notification will be deleted and other fields will be ignored."
- }
- ]
- }
- ]
+ "id": 6,
+ "name": "feature_id",
+ "type": "string"
}
]
},
{
- "name": "UpdatePushResponse",
+ "name": "ListCodeReferencesResponse",
"fields": [
{
"id": 1,
- "name": "push",
- "type": "push.Push"
+ "name": "code_references",
+ "type": "bucketeer.coderef.CodeReference",
+ "is_repeated": true
+ },
+ {
+ "id": 2,
+ "name": "cursor",
+ "type": "string"
+ },
+ {
+ "id": 3,
+ "name": "total_count",
+ "type": "int64"
}
]
},
{
- "name": "CreateAccountV2Request",
+ "name": "CreateCodeReferenceRequest",
"fields": [
{
"id": 1,
- "name": "email",
+ "name": "feature_id",
"type": "string"
},
{
"id": 2,
- "name": "name",
+ "name": "environment_id",
"type": "string"
},
{
"id": 3,
- "name": "avatar_image_url",
+ "name": "file_path",
"type": "string"
},
{
"id": 4,
- "name": "organization_id",
- "type": "string"
+ "name": "line_number",
+ "type": "int32"
},
{
"id": 5,
- "name": "organization_role",
- "type": "account.AccountV2.Role.Organization"
+ "name": "code_snippet",
+ "type": "string"
},
{
"id": 6,
- "name": "environment_roles",
- "type": "account.AccountV2.EnvironmentRole",
- "is_repeated": true
+ "name": "content_hash",
+ "type": "string"
},
{
"id": 7,
- "name": "first_name",
- "type": "string"
+ "name": "aliases",
+ "type": "string",
+ "is_repeated": true
},
{
"id": 8,
- "name": "last_name",
+ "name": "repository_name",
"type": "string"
},
{
"id": 9,
- "name": "language",
+ "name": "repository_owner",
+ "type": "string"
+ },
+ {
+ "id": 10,
+ "name": "repository_type",
+ "type": "bucketeer.coderef.CodeReference.RepositoryType"
+ },
+ {
+ "id": 11,
+ "name": "repository_branch",
+ "type": "string"
+ },
+ {
+ "id": 12,
+ "name": "commit_hash",
"type": "string"
}
]
},
{
- "name": "CreateAccountV2Response",
+ "name": "CreateCodeReferenceResponse",
"fields": [
{
"id": 1,
- "name": "account",
- "type": "account.AccountV2"
+ "name": "code_reference",
+ "type": "bucketeer.coderef.CodeReference"
}
]
},
{
- "name": "UpdateAccountV2Request",
+ "name": "UpdateCodeReferenceRequest",
"fields": [
{
"id": 1,
- "name": "email",
+ "name": "id",
"type": "string"
},
{
"id": 2,
- "name": "organization_id",
+ "name": "file_path",
"type": "string"
},
{
"id": 3,
- "name": "name",
- "type": "google.protobuf.StringValue"
+ "name": "line_number",
+ "type": "int32"
},
{
"id": 4,
- "name": "avatar_image_url",
- "type": "google.protobuf.StringValue"
+ "name": "code_snippet",
+ "type": "string"
},
{
"id": 5,
- "name": "organization_role",
- "type": "account.UpdateAccountV2Request.OrganizationRoleValue"
+ "name": "content_hash",
+ "type": "string"
},
{
"id": 6,
- "name": "environment_roles",
- "type": "account.AccountV2.EnvironmentRole",
+ "name": "aliases",
+ "type": "string",
"is_repeated": true
},
{
"id": 7,
- "name": "first_name",
- "type": "google.protobuf.StringValue"
+ "name": "repository_branch",
+ "type": "string"
},
{
"id": 8,
- "name": "last_name",
- "type": "google.protobuf.StringValue"
- },
+ "name": "commit_hash",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "UpdateCodeReferenceResponse",
+ "fields": [
{
- "id": 9,
- "name": "language",
- "type": "google.protobuf.StringValue"
- },
+ "id": 1,
+ "name": "code_reference",
+ "type": "bucketeer.coderef.CodeReference"
+ }
+ ]
+ },
+ {
+ "name": "DeleteCodeReferenceRequest",
+ "fields": [
{
- "id": 10,
- "name": "last_seen",
- "type": "google.protobuf.Int64Value"
+ "id": 1,
+ "name": "id",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "name": "DeleteCodeReferenceResponse"
+ }
+ ],
+ "services": [
+ {
+ "name": "Gateway",
+ "rpcs": [
+ {
+ "name": "GetEvaluations",
+ "in_type": "GetEvaluationsRequest",
+ "out_type": "GetEvaluationsResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "post",
+ "value": "/get_evaluations"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get Evaluations"
+ },
+ {
+ "name": "description",
+ "value": "Gets all the evaluations for a specific user. To call this API, you need a `CLIENT` API Key role."
+ },
+ {
+ "name": "tags",
+ "value": "Client and Server SDKs"
+ },
+ {
+ "name": "operation_id",
+ "value": "api.gateway.get_evaluations"
+ },
+ {
+ "name": "parameters",
+ "aggregated": [
+ {
+ "name": "headers",
+ "aggregated": [
+ {
+ "name": "name",
+ "value": "authorization"
+ },
+ {
+ "name": "description",
+ "value": "The API Key generated on the Admin Console."
+ },
+ {
+ "name": "type",
+ "value": "STRING"
+ },
+ {
+ "name": "required",
+ "value": "true"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
},
{
- "id": 11,
- "name": "avatar",
- "type": "account.UpdateAccountV2Request.AccountV2Avatar"
+ "name": "GetEvaluation",
+ "in_type": "GetEvaluationRequest",
+ "out_type": "GetEvaluationResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "post",
+ "value": "/get_evaluation"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get Evaluation"
+ },
+ {
+ "name": "description",
+ "value": "Gets a single evaluation for a specific user. To call this API, you need a `CLIENT` API Key role."
+ },
+ {
+ "name": "tags",
+ "value": "Client and Server SDKs"
+ },
+ {
+ "name": "operation_id",
+ "value": "api.gateway.get_evaluation"
+ },
+ {
+ "name": "parameters",
+ "aggregated": [
+ {
+ "name": "headers",
+ "aggregated": [
+ {
+ "name": "name",
+ "value": "authorization"
+ },
+ {
+ "name": "description",
+ "value": "The API Key generated on the Admin Console."
+ },
+ {
+ "name": "type",
+ "value": "STRING"
+ },
+ {
+ "name": "required",
+ "value": "true"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
},
{
- "id": 12,
- "name": "disabled",
- "type": "google.protobuf.BoolValue",
+ "name": "GetFeatureFlags",
+ "in_type": "GetFeatureFlagsRequest",
+ "out_type": "GetFeatureFlagsResponse",
"options": [
{
- "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "name": "(google.api.http)",
"aggregated": [
{
- "name": "title",
- "value": "disabled"
+ "name": "post",
+ "value": "/get_feature_flags"
+ },
+ {
+ "name": "body",
+ "value": "*"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get Feature Flags"
},
{
"name": "description",
- "value": "if disabled is true, the account will be disabled. If false, the account will be enabled."
+ "value": "Gets all the feature flag in an environment. To call this API, it needs `SERVER` API Key role."
+ },
+ {
+ "name": "tags",
+ "value": "Client and Server SDKs"
+ },
+ {
+ "name": "operation_id",
+ "value": "api.gateway.get_feature_flags"
+ },
+ {
+ "name": "parameters",
+ "aggregated": [
+ {
+ "name": "headers",
+ "aggregated": [
+ {
+ "name": "name",
+ "value": "authorization"
+ },
+ {
+ "name": "description",
+ "value": "The API Key generated on the Admin Console."
+ },
+ {
+ "name": "type",
+ "value": "STRING"
+ },
+ {
+ "name": "required",
+ "value": "true"
+ }
+ ]
+ }
+ ]
}
]
}
]
},
{
- "id": 13,
- "name": "deleted",
- "type": "google.protobuf.BoolValue",
+ "name": "GetSegmentUsers",
+ "in_type": "GetSegmentUsersRequest",
+ "out_type": "GetSegmentUsersResponse",
"options": [
{
- "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field)",
+ "name": "(google.api.http)",
"aggregated": [
{
- "name": "title",
- "value": "deleted"
+ "name": "post",
+ "value": "/get_segment_users"
},
{
- "name": "description",
- "value": "if true, the account will be deleted and other fields will be ignored."
+ "name": "body",
+ "value": "*"
}
]
- }
- ]
- }
- ]
- },
- {
- "name": "UpdateAccountV2Response",
- "fields": [
- {
- "id": 1,
- "name": "account",
- "type": "account.AccountV2"
- }
- ]
- },
- {
- "name": "GetAccountV2Request",
- "fields": [
- {
- "id": 1,
- "name": "email",
- "type": "string"
- },
- {
- "id": 2,
- "name": "organization_id",
- "type": "string"
- }
- ]
- },
- {
- "name": "GetAccountV2Response",
- "fields": [
- {
- "id": 1,
- "name": "account",
- "type": "account.AccountV2"
- }
- ]
- },
- {
- "name": "GetAccountV2ByEnvironmentIDRequest",
- "fields": [
- {
- "id": 1,
- "name": "email",
- "type": "string"
- },
- {
- "id": 2,
- "name": "environment_id",
- "type": "string"
- }
- ]
- },
- {
- "name": "GetAccountV2ByEnvironmentIDResponse",
- "fields": [
- {
- "id": 1,
- "name": "account",
- "type": "account.AccountV2"
- }
- ]
- },
- {
- "name": "GetMeRequest",
- "fields": [
- {
- "id": 1,
- "name": "organization_id",
- "type": "string"
- }
- ]
- },
- {
- "name": "GetMeResponse",
- "fields": [
- {
- "id": 1,
- "name": "account",
- "type": "account.ConsoleAccount"
- }
- ]
- },
- {
- "name": "ListAccountsV2Request",
- "fields": [
- {
- "id": 1,
- "name": "page_size",
- "type": "int64"
- },
- {
- "id": 2,
- "name": "cursor",
- "type": "string"
- },
- {
- "id": 3,
- "name": "organization_id",
- "type": "string"
- },
- {
- "id": 4,
- "name": "order_by",
- "type": "account.ListAccountsV2Request.OrderBy"
- },
- {
- "id": 5,
- "name": "order_direction",
- "type": "account.ListAccountsV2Request.OrderDirection"
- },
- {
- "id": 6,
- "name": "search_keyword",
- "type": "string"
- },
- {
- "id": 7,
- "name": "disabled",
- "type": "google.protobuf.BoolValue"
- },
- {
- "id": 8,
- "name": "organization_role",
- "type": "google.protobuf.Int32Value"
- },
- {
- "id": 9,
- "name": "environment_id",
- "type": "google.protobuf.StringValue"
- },
- {
- "id": 10,
- "name": "environment_role",
- "type": "google.protobuf.Int32Value"
- }
- ]
- },
- {
- "name": "ListAccountsV2Response",
- "fields": [
- {
- "id": 1,
- "name": "accounts",
- "type": "account.AccountV2",
- "is_repeated": true
- },
- {
- "id": 2,
- "name": "cursor",
- "type": "string"
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Get Segment Users"
+ },
+ {
+ "name": "description",
+ "value": "Gets all the segment users in an environment. To call this API, it needs `SERVER` API Key role."
+ },
+ {
+ "name": "tags",
+ "value": "Client and Server SDKs"
+ },
+ {
+ "name": "operation_id",
+ "value": "api.gateway.get_segment_users"
+ },
+ {
+ "name": "parameters",
+ "aggregated": [
+ {
+ "name": "headers",
+ "aggregated": [
+ {
+ "name": "name",
+ "value": "authorization"
+ },
+ {
+ "name": "description",
+ "value": "The API Key generated on the Admin Console."
+ },
+ {
+ "name": "type",
+ "value": "STRING"
+ },
+ {
+ "name": "required",
+ "value": "true"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
},
{
- "id": 3,
- "name": "total_count",
- "type": "int64"
- }
- ]
- }
- ],
- "services": [
- {
- "name": "Gateway",
- "rpcs": [
- {
- "name": "GetEvaluations",
- "in_type": "GetEvaluationsRequest",
- "out_type": "GetEvaluationsResponse",
+ "name": "RegisterEvents",
+ "in_type": "RegisterEventsRequest",
+ "out_type": "RegisterEventsResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "post",
- "value": "/get_evaluations"
+ "value": "/register_events"
},
{
"name": "body",
@@ -27358,11 +30276,11 @@
"aggregated": [
{
"name": "summary",
- "value": "Get Evaluations"
+ "value": "Register Events"
},
{
"name": "description",
- "value": "Gets all the evaluations for a specific user. To call this API, you need a `CLIENT` API Key role."
+ "value": "This API is for reporting Goal events. To call this API, it needs a `CLIENT` or `SERVER` API Key role."
},
{
"name": "tags",
@@ -27370,7 +30288,7 @@
},
{
"name": "operation_id",
- "value": "api.gateway.get_evaluations"
+ "value": "api.gateway.register_events"
},
{
"name": "parameters",
@@ -27403,16 +30321,53 @@
]
},
{
- "name": "GetEvaluation",
- "in_type": "GetEvaluationRequest",
- "out_type": "GetEvaluationResponse",
+ "name": "Track",
+ "in_type": "TrackRequest",
+ "out_type": "TrackResponse",
+ "options": [
+ {
+ "name": "(google.api.http)",
+ "aggregated": [
+ {
+ "name": "get",
+ "value": "/track"
+ }
+ ]
+ },
+ {
+ "name": "(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation)",
+ "aggregated": [
+ {
+ "name": "summary",
+ "value": "Track"
+ },
+ {
+ "name": "description",
+ "value": "This API is an integration for Google Tab Manager to report Goal events. To call this API, you need a `CLIENT` API Key role."
+ },
+ {
+ "name": "tags",
+ "value": "Client and Server SDKs"
+ },
+ {
+ "name": "operation_id",
+ "value": "api.gateway.track"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "CreateFeature",
+ "in_type": "CreateFeatureRequest",
+ "out_type": "CreateFeatureResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "post",
- "value": "/get_evaluation"
+ "value": "/v1/features"
},
{
"name": "body",
@@ -27425,19 +30380,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get Evaluation"
+ "value": "Create"
},
{
"name": "description",
- "value": "Gets a single evaluation for a specific user. To call this API, you need a `CLIENT` API Key role."
+ "value": "Create a new Feature Flag. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Client and Server SDKs"
+ "value": "Feature Flags"
},
{
"name": "operation_id",
- "value": "api.gateway.get_evaluation"
+ "value": "api.gateway.v1.features.create"
},
{
"name": "parameters",
@@ -27470,20 +30425,16 @@
]
},
{
- "name": "GetFeatureFlags",
- "in_type": "GetFeatureFlagsRequest",
- "out_type": "GetFeatureFlagsResponse",
+ "name": "GetFeature",
+ "in_type": "GetFeatureRequest",
+ "out_type": "GetFeatureResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/get_feature_flags"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/features/{id}"
}
]
},
@@ -27492,19 +30443,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get Feature Flags"
+ "value": "Get"
},
{
"name": "description",
- "value": "Gets all the feature flag in an environment. To call this API, it needs `SERVER` API Key role."
+ "value": "Get a Feature Flag. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Client and Server SDKs"
+ "value": "Feature Flags"
},
{
"name": "operation_id",
- "value": "api.gateway.get_feature_flags"
+ "value": "api.gateway.v1.features.get"
},
{
"name": "parameters",
@@ -27537,20 +30488,16 @@
]
},
{
- "name": "GetSegmentUsers",
- "in_type": "GetSegmentUsersRequest",
- "out_type": "GetSegmentUsersResponse",
+ "name": "ListFeatures",
+ "in_type": "ListFeaturesRequest",
+ "out_type": "ListFeaturesResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/get_segment_users"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/features"
}
]
},
@@ -27559,19 +30506,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get Segment Users"
+ "value": "List"
},
{
"name": "description",
- "value": "Gets all the segment users in an environment. To call this API, it needs `SERVER` API Key role."
+ "value": "List Feature Flags. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Client and Server SDKs"
+ "value": "Feature Flags"
},
{
"name": "operation_id",
- "value": "api.gateway.get_segment_users"
+ "value": "api.gateway.v1.features.list"
},
{
"name": "parameters",
@@ -27604,16 +30551,16 @@
]
},
{
- "name": "RegisterEvents",
- "in_type": "RegisterEventsRequest",
- "out_type": "RegisterEventsResponse",
+ "name": "UpdateFeature",
+ "in_type": "UpdateFeatureRequest",
+ "out_type": "UpdateFeatureResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/register_events"
+ "name": "patch",
+ "value": "/v1/features/{id}"
},
{
"name": "body",
@@ -27626,19 +30573,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Register Events"
+ "value": "Update"
},
{
"name": "description",
- "value": "This API is for reporting Goal events. To call this API, it needs a `CLIENT` or `SERVER` API Key role."
+ "value": "Update a Feature Flag. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Client and Server SDKs"
+ "value": "Feature Flags"
},
{
"name": "operation_id",
- "value": "api.gateway.register_events"
+ "value": "api.gateway.v1.features.update"
},
{
"name": "parameters",
@@ -27671,16 +30618,16 @@
]
},
{
- "name": "Track",
- "in_type": "TrackRequest",
- "out_type": "TrackResponse",
+ "name": "Ping",
+ "in_type": "PingRequest",
+ "out_type": "PingResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/track"
+ "value": "/ping"
}
]
},
@@ -27689,39 +30636,64 @@
"aggregated": [
{
"name": "summary",
- "value": "Track"
+ "value": "Ping"
},
{
"name": "description",
- "value": "This API is an integration for Google Tab Manager to report Goal events. To call this API, you need a `CLIENT` API Key role."
+ "value": "Ping the server to check its availability."
},
{
"name": "tags",
- "value": "Client and Server SDKs"
+ "value": "Utility"
},
{
"name": "operation_id",
- "value": "api.gateway.track"
+ "value": "api.gateway.ping"
+ },
+ {
+ "name": "parameters",
+ "aggregated": [
+ {
+ "name": "headers",
+ "aggregated": [
+ {
+ "name": "name",
+ "value": "authorization"
+ },
+ {
+ "name": "description",
+ "value": "The API Key generated on the Admin Console."
+ },
+ {
+ "name": "type",
+ "value": "STRING"
+ },
+ {
+ "name": "required",
+ "value": "true"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "security"
}
]
}
]
},
{
- "name": "CreateFeature",
- "in_type": "CreateFeatureRequest",
- "out_type": "CreateFeatureResponse",
+ "name": "ListPushes",
+ "in_type": "ListPushesRequest",
+ "out_type": "ListPushesResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/v1/features"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/pushes"
}
]
},
@@ -27730,19 +30702,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Create"
+ "value": "List"
},
{
"name": "description",
- "value": "Create a new Feature Flag. To call this API, you need a `WRITE` or `ADMIN` API Key role."
+ "value": "List pushes. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Feature Flags"
+ "value": "Pushes"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.features.create"
+ "value": "api.gateway.v1.pushes.list"
},
{
"name": "parameters",
@@ -27775,16 +30747,20 @@
]
},
{
- "name": "GetFeature",
- "in_type": "GetFeatureRequest",
- "out_type": "GetFeatureResponse",
+ "name": "CreatePush",
+ "in_type": "CreatePushRequest",
+ "out_type": "CreatePushResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/v1/features/{id}"
+ "name": "post",
+ "value": "/v1/push"
+ },
+ {
+ "name": "body",
+ "value": "*"
}
]
},
@@ -27793,19 +30769,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get"
+ "value": "Create"
},
{
"name": "description",
- "value": "Get a Feature Flag. To call this API, you need a `READ` API Key role."
+ "value": "Create a new Push notification through Google Firebase Cloud Messaging (FCM). To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Feature Flags"
+ "value": "Pushes"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.features.get"
+ "value": "api.gateway.v1.pushes.create"
},
{
"name": "parameters",
@@ -27838,16 +30814,16 @@
]
},
{
- "name": "ListFeatures",
- "in_type": "ListFeaturesRequest",
- "out_type": "ListFeaturesResponse",
+ "name": "GetPush",
+ "in_type": "GetPushRequest",
+ "out_type": "GetPushResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/v1/features"
+ "value": "/v1/push/{id}"
}
]
},
@@ -27856,19 +30832,19 @@
"aggregated": [
{
"name": "summary",
- "value": "List"
+ "value": "Get"
},
{
"name": "description",
- "value": "List Feature Flags. To call this API, you need a `READ` API Key role."
+ "value": "Get a Push notification. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Feature Flags"
+ "value": "Pushes"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.features.list"
+ "value": "api.gateway.v1.pushes.get"
},
{
"name": "parameters",
@@ -27901,16 +30877,16 @@
]
},
{
- "name": "UpdateFeature",
- "in_type": "UpdateFeatureRequest",
- "out_type": "UpdateFeatureResponse",
+ "name": "UpdatePush",
+ "in_type": "UpdatePushRequest",
+ "out_type": "UpdatePushResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "patch",
- "value": "/v1/features/{id}"
+ "value": "/v1/push/{id}"
},
{
"name": "body",
@@ -27927,15 +30903,15 @@
},
{
"name": "description",
- "value": "Update a Feature Flag. To call this API, you need a `WRITE` or `ADMIN` API Key role."
+ "value": "Update a Push notification. To call this API, you a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Feature Flags"
+ "value": "Pushes"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.features.update"
+ "value": "api.gateway.v1.pushes.update"
},
{
"name": "parameters",
@@ -27968,16 +30944,20 @@
]
},
{
- "name": "Ping",
- "in_type": "PingRequest",
- "out_type": "PingResponse",
+ "name": "CreateAccountV2",
+ "in_type": "CreateAccountV2Request",
+ "out_type": "CreateAccountV2Response",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/ping"
+ "name": "post",
+ "value": "/v1/account"
+ },
+ {
+ "name": "body",
+ "value": "*"
}
]
},
@@ -27986,19 +30966,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Ping"
+ "value": "Create"
},
{
"name": "description",
- "value": "Ping the server to check its availability."
+ "value": "Create a new Account. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Utility"
+ "value": "Account"
},
{
"name": "operation_id",
- "value": "api.gateway.ping"
+ "value": "api.gateway.v1.account.create"
},
{
"name": "parameters",
@@ -28025,25 +31005,26 @@
]
}
]
- },
- {
- "name": "security"
}
]
}
]
},
{
- "name": "ListPushes",
- "in_type": "ListPushesRequest",
- "out_type": "ListPushesResponse",
+ "name": "UpdateAccountV2",
+ "in_type": "UpdateAccountV2Request",
+ "out_type": "UpdateAccountV2Response",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/v1/pushes"
+ "name": "patch",
+ "value": "/v1/account/{organization_id}/{email}"
+ },
+ {
+ "name": "body",
+ "value": "*"
}
]
},
@@ -28052,19 +31033,19 @@
"aggregated": [
{
"name": "summary",
- "value": "List"
+ "value": "Update"
},
{
"name": "description",
- "value": "List pushes. To call this API, you need a `READ` API Key role."
+ "value": "Update an Account. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Pushes"
+ "value": "Account"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.pushes.list"
+ "value": "api.gateway.v1.account.update"
},
{
"name": "parameters",
@@ -28097,20 +31078,16 @@
]
},
{
- "name": "CreatePush",
- "in_type": "CreatePushRequest",
- "out_type": "CreatePushResponse",
+ "name": "GetAccountV2",
+ "in_type": "GetAccountV2Request",
+ "out_type": "GetAccountV2Response",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/v1/push"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/account/{organization_id}/{email}"
}
]
},
@@ -28119,19 +31096,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Create"
+ "value": "Get by Organization ID"
},
{
"name": "description",
- "value": "Create a new Push notification through Google Firebase Cloud Messaging (FCM). To call this API, you need a `WRITE` or `ADMIN` API Key role."
+ "value": "Get an Account. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Pushes"
+ "value": "Account"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.pushes.create"
+ "value": "api.gateway.v1.account.get"
},
{
"name": "parameters",
@@ -28164,16 +31141,16 @@
]
},
{
- "name": "GetPush",
- "in_type": "GetPushRequest",
- "out_type": "GetPushResponse",
+ "name": "GetAccountV2ByEnvironmentID",
+ "in_type": "GetAccountV2ByEnvironmentIDRequest",
+ "out_type": "GetAccountV2ByEnvironmentIDResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/v1/push/{id}"
+ "value": "/v1/account/get-account-by-environment/{environment_id}/{email}"
}
]
},
@@ -28182,19 +31159,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get"
+ "value": "Get by Environment ID"
},
{
"name": "description",
- "value": "Get a Push notification. To call this API, you need a `READ` API Key role."
+ "value": "Get an Account by Environment ID. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Pushes"
+ "value": "Account"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.pushes.get"
+ "value": "api.gateway.v1.account.get_by_environment_id"
},
{
"name": "parameters",
@@ -28227,20 +31204,16 @@
]
},
{
- "name": "UpdatePush",
- "in_type": "UpdatePushRequest",
- "out_type": "UpdatePushResponse",
+ "name": "GetMe",
+ "in_type": "GetMeRequest",
+ "out_type": "GetMeResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "patch",
- "value": "/v1/push/{id}"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/account/me/{organization_id}"
}
]
},
@@ -28249,19 +31222,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Update"
+ "value": "Get Service Account"
},
{
"name": "description",
- "value": "Update a Push notification. To call this API, you a `WRITE` or `ADMIN` API Key role."
+ "value": "Get the current Account. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Pushes"
+ "value": "Account"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.pushes.update"
+ "value": "api.gateway.v1.account.get_me"
},
{
"name": "parameters",
@@ -28294,20 +31267,16 @@
]
},
{
- "name": "CreateAccountV2",
- "in_type": "CreateAccountV2Request",
- "out_type": "CreateAccountV2Response",
+ "name": "ListAccountsV2",
+ "in_type": "ListAccountsV2Request",
+ "out_type": "ListAccountsV2Response",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "post",
- "value": "/v1/account"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/accounts"
}
]
},
@@ -28316,11 +31285,11 @@
"aggregated": [
{
"name": "summary",
- "value": "Create"
+ "value": "List"
},
{
"name": "description",
- "value": "Create a new Account. To call this API, you need a `WRITE` or `ADMIN` API Key role."
+ "value": "Get list Accounts. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
@@ -28328,7 +31297,7 @@
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.create"
+ "value": "api.gateway.v1.account.list"
},
{
"name": "parameters",
@@ -28361,20 +31330,16 @@
]
},
{
- "name": "UpdateAccountV2",
- "in_type": "UpdateAccountV2Request",
- "out_type": "UpdateAccountV2Response",
+ "name": "GetCodeReference",
+ "in_type": "GetCodeReferenceRequest",
+ "out_type": "GetCodeReferenceResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "patch",
- "value": "/v1/account/{organization_id}/{email}"
- },
- {
- "name": "body",
- "value": "*"
+ "name": "get",
+ "value": "/v1/code_references/{id}"
}
]
},
@@ -28383,19 +31348,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Update"
+ "value": "Get"
},
{
"name": "description",
- "value": "Update an Account. To call this API, you need a `WRITE` or `ADMIN` API Key role."
+ "value": "Get a code reference. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Account"
+ "value": "Code References"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.update"
+ "value": "api.gateway.v1.code_references.get"
},
{
"name": "parameters",
@@ -28428,16 +31393,16 @@
]
},
{
- "name": "GetAccountV2",
- "in_type": "GetAccountV2Request",
- "out_type": "GetAccountV2Response",
+ "name": "ListCodeReferences",
+ "in_type": "ListCodeReferencesRequest",
+ "out_type": "ListCodeReferencesResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
"name": "get",
- "value": "/v1/account/{organization_id}/{email}"
+ "value": "/v1/code_references"
}
]
},
@@ -28446,19 +31411,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get by Organization ID"
+ "value": "List"
},
{
"name": "description",
- "value": "Get an Account. To call this API, you need a `READ` API Key role."
+ "value": "List code references. To call this API, you need a `READ` API Key role."
},
{
"name": "tags",
- "value": "Account"
+ "value": "Code References"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.get"
+ "value": "api.gateway.v1.code_references.list"
},
{
"name": "parameters",
@@ -28491,16 +31456,20 @@
]
},
{
- "name": "GetAccountV2ByEnvironmentID",
- "in_type": "GetAccountV2ByEnvironmentIDRequest",
- "out_type": "GetAccountV2ByEnvironmentIDResponse",
+ "name": "CreateCodeReference",
+ "in_type": "CreateCodeReferenceRequest",
+ "out_type": "CreateCodeReferenceResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/v1/account/get-account-by-environment/{environment_id}/{email}"
+ "name": "post",
+ "value": "/v1/code_references"
+ },
+ {
+ "name": "body",
+ "value": "*"
}
]
},
@@ -28509,19 +31478,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get by Environment ID"
+ "value": "Create"
},
{
"name": "description",
- "value": "Get an Account by Environment ID. To call this API, you need a `READ` API Key role."
+ "value": "Create a new code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Account"
+ "value": "Code References"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.get_by_environment_id"
+ "value": "api.gateway.v1.code_references.create"
},
{
"name": "parameters",
@@ -28554,16 +31523,20 @@
]
},
{
- "name": "GetMe",
- "in_type": "GetMeRequest",
- "out_type": "GetMeResponse",
+ "name": "UpdateCodeReference",
+ "in_type": "UpdateCodeReferenceRequest",
+ "out_type": "UpdateCodeReferenceResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/v1/account/me/{organization_id}"
+ "name": "patch",
+ "value": "/v1/code_references/{id}"
+ },
+ {
+ "name": "body",
+ "value": "*"
}
]
},
@@ -28572,19 +31545,19 @@
"aggregated": [
{
"name": "summary",
- "value": "Get Service Account"
+ "value": "Update"
},
{
"name": "description",
- "value": "Get the current Account. To call this API, you need a `READ` API Key role."
+ "value": "Update a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Account"
+ "value": "Code References"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.get_me"
+ "value": "api.gateway.v1.code_references.update"
},
{
"name": "parameters",
@@ -28617,16 +31590,16 @@
]
},
{
- "name": "ListAccountsV2",
- "in_type": "ListAccountsV2Request",
- "out_type": "ListAccountsV2Response",
+ "name": "DeleteCodeReference",
+ "in_type": "DeleteCodeReferenceRequest",
+ "out_type": "DeleteCodeReferenceResponse",
"options": [
{
"name": "(google.api.http)",
"aggregated": [
{
- "name": "get",
- "value": "/v1/accounts"
+ "name": "delete",
+ "value": "/v1/code_references/{id}"
}
]
},
@@ -28635,19 +31608,19 @@
"aggregated": [
{
"name": "summary",
- "value": "List"
+ "value": "Delete"
},
{
"name": "description",
- "value": "Get list Accounts. To call this API, you need a `READ` API Key role."
+ "value": "Delete a code reference. To call this API, you need a `WRITE` or `ADMIN` API Key role."
},
{
"name": "tags",
- "value": "Account"
+ "value": "Code References"
},
{
"name": "operation_id",
- "value": "api.gateway.v1.account.list"
+ "value": "api.gateway.v1.code_references.delete"
},
{
"name": "parameters",
@@ -28736,6 +31709,12 @@
},
{
"path": "proto/event/client/event.proto"
+ },
+ {
+ "path": "proto/coderef/code_reference.proto"
+ },
+ {
+ "path": "proto/coderef/service.proto"
}
],
"package": {
@@ -30887,6 +33866,10 @@
"name": "DOMAIN_EVENT_TAG",
"integer": 17
},
+ {
+ "name": "DOMAIN_EVENT_CODEREF",
+ "integer": 18
+ },
{
"name": "FEATURE_STALE",
"integer": 100
@@ -32270,6 +35253,11 @@
"id": 8,
"name": "organization_id",
"type": "string"
+ },
+ {
+ "id": 9,
+ "name": "entity_type",
+ "type": "Tag.EntityType"
}
],
"reserved_ids": [
@@ -32697,6 +35685,9 @@
{
"path": "google/api/field_behavior.proto"
},
+ {
+ "path": "google/protobuf/wrappers.proto"
+ },
{
"path": "protoc-gen-openapiv2/options/annotations.proto"
},
@@ -32723,7 +35714,7 @@
"name": "Tag.EntityType",
"enum_fields": [
{
- "name": "UNKNOWN"
+ "name": "UNSPECIFIED"
},
{
"name": "FEATURE_FLAG",
@@ -32771,6 +35762,22 @@
"type": "string"
}
]
+ },
+ {
+ "name": "EnvironmentTag",
+ "fields": [
+ {
+ "id": 1,
+ "name": "environment_id",
+ "type": "string"
+ },
+ {
+ "id": 2,
+ "name": "tags",
+ "type": "Tag",
+ "is_repeated": true
+ }
+ ]
}
],
"package": {
diff --git a/proto/tag/proto_descriptor.pb b/proto/tag/proto_descriptor.pb
index 88716c49dc..02b3969c8c 100644
Binary files a/proto/tag/proto_descriptor.pb and b/proto/tag/proto_descriptor.pb differ
diff --git a/proto/tag/service.pb.go b/proto/tag/service.pb.go
index 6c6f2efded..b5a191ce38 100644
--- a/proto/tag/service.pb.go
+++ b/proto/tag/service.pb.go
@@ -29,6 +29,7 @@ import (
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ _ "google.golang.org/protobuf/types/known/wrapperspb"
reflect "reflect"
sync "sync"
)
@@ -197,7 +198,7 @@ func (x *CreateTagRequest) GetEntityType() Tag_EntityType {
if x != nil {
return x.EntityType
}
- return Tag_UNKNOWN
+ return Tag_UNSPECIFIED
}
func (x *CreateTagRequest) GetEnvironmentId() string {
@@ -359,6 +360,7 @@ type ListTagsRequest struct {
SearchKeyword string `protobuf:"bytes,6,opt,name=search_keyword,json=searchKeyword,proto3" json:"search_keyword"`
EnvironmentId string `protobuf:"bytes,7,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
OrganizationId string `protobuf:"bytes,8,opt,name=organization_id,json=organizationId,proto3" json:"organization_id"`
+ EntityType Tag_EntityType `protobuf:"varint,9,opt,name=entity_type,json=entityType,proto3,enum=bucketeer.tag.Tag_EntityType" json:"entity_type"`
}
func (x *ListTagsRequest) Reset() {
@@ -442,6 +444,13 @@ func (x *ListTagsRequest) GetOrganizationId() string {
return ""
}
+func (x *ListTagsRequest) GetEntityType() Tag_EntityType {
+ if x != nil {
+ return x.EntityType
+ }
+ return Tag_UNSPECIFIED
+}
+
type ListTagsResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -514,7 +523,9 @@ var file_proto_tag_service_proto_rawDesc = []byte{
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f,
- 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d,
+ 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+ 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d,
0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74,
@@ -539,7 +550,7 @@ var file_proto_tag_service_proto_rawDesc = []byte{
0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x65, 0x6e,
0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x44,
0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x22, 0xe7, 0x03, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71,
+ 0x22, 0xa7, 0x04, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a,
0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,
@@ -560,7 +571,11 @@ var file_proto_tag_service_proto_rawDesc = []byte{
0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67,
- 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x07, 0x4f,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x1d, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x74, 0x61, 0x67,
+ 0x2e, 0x54, 0x61, 0x67, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52,
+ 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0x62, 0x0a, 0x07, 0x4f,
0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c,
0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a,
0x0a, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a,
@@ -711,18 +726,19 @@ var file_proto_tag_service_proto_depIdxs = []int32{
9, // 1: bucketeer.tag.CreateTagResponse.tag:type_name -> bucketeer.tag.Tag
0, // 2: bucketeer.tag.ListTagsRequest.order_by:type_name -> bucketeer.tag.ListTagsRequest.OrderBy
1, // 3: bucketeer.tag.ListTagsRequest.order_direction:type_name -> bucketeer.tag.ListTagsRequest.OrderDirection
- 9, // 4: bucketeer.tag.ListTagsResponse.tags:type_name -> bucketeer.tag.Tag
- 6, // 5: bucketeer.tag.TagService.ListTags:input_type -> bucketeer.tag.ListTagsRequest
- 2, // 6: bucketeer.tag.TagService.CreateTag:input_type -> bucketeer.tag.CreateTagRequest
- 4, // 7: bucketeer.tag.TagService.DeleteTag:input_type -> bucketeer.tag.DeleteTagRequest
- 7, // 8: bucketeer.tag.TagService.ListTags:output_type -> bucketeer.tag.ListTagsResponse
- 3, // 9: bucketeer.tag.TagService.CreateTag:output_type -> bucketeer.tag.CreateTagResponse
- 5, // 10: bucketeer.tag.TagService.DeleteTag:output_type -> bucketeer.tag.DeleteTagResponse
- 8, // [8:11] is the sub-list for method output_type
- 5, // [5:8] is the sub-list for method input_type
- 5, // [5:5] is the sub-list for extension type_name
- 5, // [5:5] is the sub-list for extension extendee
- 0, // [0:5] is the sub-list for field type_name
+ 8, // 4: bucketeer.tag.ListTagsRequest.entity_type:type_name -> bucketeer.tag.Tag.EntityType
+ 9, // 5: bucketeer.tag.ListTagsResponse.tags:type_name -> bucketeer.tag.Tag
+ 6, // 6: bucketeer.tag.TagService.ListTags:input_type -> bucketeer.tag.ListTagsRequest
+ 2, // 7: bucketeer.tag.TagService.CreateTag:input_type -> bucketeer.tag.CreateTagRequest
+ 4, // 8: bucketeer.tag.TagService.DeleteTag:input_type -> bucketeer.tag.DeleteTagRequest
+ 7, // 9: bucketeer.tag.TagService.ListTags:output_type -> bucketeer.tag.ListTagsResponse
+ 3, // 10: bucketeer.tag.TagService.CreateTag:output_type -> bucketeer.tag.CreateTagResponse
+ 5, // 11: bucketeer.tag.TagService.DeleteTag:output_type -> bucketeer.tag.DeleteTagResponse
+ 9, // [9:12] is the sub-list for method output_type
+ 6, // [6:9] is the sub-list for method input_type
+ 6, // [6:6] is the sub-list for extension type_name
+ 6, // [6:6] is the sub-list for extension extendee
+ 0, // [0:6] is the sub-list for field type_name
}
func init() { file_proto_tag_service_proto_init() }
diff --git a/proto/tag/service.proto b/proto/tag/service.proto
index 96117c7c2c..93107fc2c9 100644
--- a/proto/tag/service.proto
+++ b/proto/tag/service.proto
@@ -19,6 +19,7 @@ option go_package = "github.com/bucketeer-io/bucketeer/proto/tag";
import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
+import "google/protobuf/wrappers.proto";
import "protoc-gen-openapiv2/options/annotations.proto";
import "proto/tag/tag.proto";
@@ -61,6 +62,7 @@ message ListTagsRequest {
string search_keyword = 6;
string environment_id = 7;
string organization_id = 8;
+ Tag.EntityType entity_type = 9;
}
message ListTagsResponse {
diff --git a/proto/tag/tag.pb.go b/proto/tag/tag.pb.go
index cbbdf5db31..5dfd61058b 100644
--- a/proto/tag/tag.pb.go
+++ b/proto/tag/tag.pb.go
@@ -37,7 +37,7 @@ const (
type Tag_EntityType int32
const (
- Tag_UNKNOWN Tag_EntityType = 0
+ Tag_UNSPECIFIED Tag_EntityType = 0
Tag_FEATURE_FLAG Tag_EntityType = 1
Tag_ACCOUNT Tag_EntityType = 2
)
@@ -45,12 +45,12 @@ const (
// Enum value maps for Tag_EntityType.
var (
Tag_EntityType_name = map[int32]string{
- 0: "UNKNOWN",
+ 0: "UNSPECIFIED",
1: "FEATURE_FLAG",
2: "ACCOUNT",
}
Tag_EntityType_value = map[string]int32{
- "UNKNOWN": 0,
+ "UNSPECIFIED": 0,
"FEATURE_FLAG": 1,
"ACCOUNT": 2,
}
@@ -160,7 +160,7 @@ func (x *Tag) GetEntityType() Tag_EntityType {
if x != nil {
return x.EntityType
}
- return Tag_UNKNOWN
+ return Tag_UNSPECIFIED
}
func (x *Tag) GetEnvironmentId() string {
@@ -170,12 +170,67 @@ func (x *Tag) GetEnvironmentId() string {
return ""
}
+type EnvironmentTag struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ EnvironmentId string `protobuf:"bytes,1,opt,name=environment_id,json=environmentId,proto3" json:"environment_id"`
+ Tags []*Tag `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags"`
+}
+
+func (x *EnvironmentTag) Reset() {
+ *x = EnvironmentTag{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_tag_tag_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnvironmentTag) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnvironmentTag) ProtoMessage() {}
+
+func (x *EnvironmentTag) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_tag_tag_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnvironmentTag.ProtoReflect.Descriptor instead.
+func (*EnvironmentTag) Descriptor() ([]byte, []int) {
+ return file_proto_tag_tag_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *EnvironmentTag) GetEnvironmentId() string {
+ if x != nil {
+ return x.EnvironmentId
+ }
+ return ""
+}
+
+func (x *EnvironmentTag) GetTags() []*Tag {
+ if x != nil {
+ return x.Tags
+ }
+ return nil
+}
+
var File_proto_tag_tag_proto protoreflect.FileDescriptor
var file_proto_tag_tag_proto_rawDesc = []byte{
0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x67, 0x2f, 0x74, 0x61, 0x67, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72,
- 0x2e, 0x74, 0x61, 0x67, 0x22, 0x88, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x0e, 0x0a, 0x02,
+ 0x2e, 0x74, 0x61, 0x67, 0x22, 0x8c, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x0e, 0x0a, 0x02,
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03,
@@ -188,14 +243,20 @@ var file_proto_tag_tag_proto_rawDesc = []byte{
0x70, 0x65, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25,
0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
- 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54,
- 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
- 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47,
- 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x02, 0x42,
- 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x67, 0x62, 0x06,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54,
+ 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+ 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f,
+ 0x46, 0x4c, 0x41, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
+ 0x54, 0x10, 0x02, 0x22, 0x5f, 0x0a, 0x0e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65,
+ 0x6e, 0x74, 0x54, 0x61, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
+ 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x04,
+ 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2e, 0x74, 0x61, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04,
+ 0x74, 0x61, 0x67, 0x73, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2d, 0x69, 0x6f, 0x2f,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x65, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+ 0x74, 0x61, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -211,18 +272,20 @@ func file_proto_tag_tag_proto_rawDescGZIP() []byte {
}
var file_proto_tag_tag_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_proto_tag_tag_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_proto_tag_tag_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_proto_tag_tag_proto_goTypes = []interface{}{
- (Tag_EntityType)(0), // 0: bucketeer.tag.Tag.EntityType
- (*Tag)(nil), // 1: bucketeer.tag.Tag
+ (Tag_EntityType)(0), // 0: bucketeer.tag.Tag.EntityType
+ (*Tag)(nil), // 1: bucketeer.tag.Tag
+ (*EnvironmentTag)(nil), // 2: bucketeer.tag.EnvironmentTag
}
var file_proto_tag_tag_proto_depIdxs = []int32{
0, // 0: bucketeer.tag.Tag.entity_type:type_name -> bucketeer.tag.Tag.EntityType
- 1, // [1:1] is the sub-list for method output_type
- 1, // [1:1] is the sub-list for method input_type
- 1, // [1:1] is the sub-list for extension type_name
- 1, // [1:1] is the sub-list for extension extendee
- 0, // [0:1] is the sub-list for field type_name
+ 1, // 1: bucketeer.tag.EnvironmentTag.tags:type_name -> bucketeer.tag.Tag
+ 2, // [2:2] is the sub-list for method output_type
+ 2, // [2:2] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
}
func init() { file_proto_tag_tag_proto_init() }
@@ -243,6 +306,18 @@ func file_proto_tag_tag_proto_init() {
return nil
}
}
+ file_proto_tag_tag_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnvironmentTag); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -250,7 +325,7 @@ func file_proto_tag_tag_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_proto_tag_tag_proto_rawDesc,
NumEnums: 1,
- NumMessages: 1,
+ NumMessages: 2,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/proto/tag/tag.proto b/proto/tag/tag.proto
index 272599d9bc..f502dc54ad 100644
--- a/proto/tag/tag.proto
+++ b/proto/tag/tag.proto
@@ -19,7 +19,7 @@ option go_package = "github.com/bucketeer-io/bucketeer/proto/tag";
message Tag {
enum EntityType {
- UNKNOWN = 0;
+ UNSPECIFIED = 0;
FEATURE_FLAG = 1;
ACCOUNT = 2;
}
@@ -30,3 +30,8 @@ message Tag {
EntityType entity_type = 5;
string environment_id = 6;
}
+
+message EnvironmentTag {
+ string environment_id = 1;
+ repeated Tag tags = 2;
+}
diff --git a/test/e2e/account/account_test.go b/test/e2e/account/account_test.go
index ed734bf14a..25f3c83f72 100644
--- a/test/e2e/account/account_test.go
+++ b/test/e2e/account/account_test.go
@@ -43,18 +43,18 @@ const (
)
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
func TestGetAccount(t *testing.T) {
diff --git a/test/e2e/autoops/auto_ops_test.go b/test/e2e/autoops/auto_ops_test.go
index ff3dfd41db..c1e467c654 100644
--- a/test/e2e/autoops/auto_ops_test.go
+++ b/test/e2e/autoops/auto_ops_test.go
@@ -64,18 +64,18 @@ const (
)
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
type eventType int
@@ -300,7 +300,7 @@ func TestDeleteAutoOpsRule(t *testing.T) {
}
deleteAutoOpsRules(t, autoOpsClient, autoOpsRules[0].Id)
resp, err := autoOpsClient.GetAutoOpsRule(ctx, &autoopsproto.GetAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: autoOpsRules[0].Id,
})
if resp != nil {
@@ -337,7 +337,7 @@ func TestUpdateAutoOpsRule(t *testing.T) {
}
updateAutoOpsRules(t, autoOpsClient, autoOpsRules[0].Id, &addClause)
resp, err := autoOpsClient.GetAutoOpsRule(ctx, &autoopsproto.GetAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: autoOpsRules[0].Id,
})
if resp == nil {
@@ -383,7 +383,7 @@ func TestExecuteAutoOpsRule(t *testing.T) {
t.Fatal("not enough rules")
}
_, err := autoOpsClient.ExecuteAutoOps(ctx, &autoopsproto.ExecuteAutoOpsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: autoOpsRules[0].Id,
ExecuteAutoOpsRuleCommand: &autoopsproto.ExecuteAutoOpsRuleCommand{
ClauseId: autoOpsRules[0].Clauses[0].Id,
@@ -422,7 +422,7 @@ func TestExecuteAutoOpsRuleForMultiSchedule(t *testing.T) {
t.Fatal("not enough rules")
}
_, err := autoOpsClient.ExecuteAutoOps(ctx, &autoopsproto.ExecuteAutoOpsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: autoOpsRules[0].Id,
ExecuteAutoOpsRuleCommand: &autoopsproto.ExecuteAutoOpsRuleCommand{
ClauseId: autoOpsRules[0].Clauses[0].Id,
@@ -768,7 +768,7 @@ func createGoal(ctx context.Context, t *testing.T, client experimentclient.Clien
}
_, err := client.CreateGoal(ctx, &experimentproto.CreateGoalRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -829,7 +829,7 @@ func createAutoOpsRule(
DatetimeClauses: dcs,
}
_, err := client.CreateAutoOpsRule(ctx, &autoopsproto.CreateAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Command: cmd,
})
if err != nil {
@@ -899,7 +899,7 @@ func createFeature(ctx context.Context, t *testing.T, client featureclient.Clien
cmd := newCreateFeatureCommand(featureID)
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.CreateFeature(ctx, createReq); err != nil {
t.Fatal(err)
@@ -912,7 +912,7 @@ func createDisabledFeature(ctx context.Context, t *testing.T, client featureclie
cmd := newCreateFeatureCommand(featureID)
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.CreateFeature(ctx, createReq); err != nil {
t.Fatal(err)
@@ -923,7 +923,7 @@ func getFeature(t *testing.T, client featureclient.Client, featureID string) *fe
t.Helper()
getReq := &featureproto.GetFeatureRequest{
Id: featureID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -985,7 +985,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &featureproto.EnableFeatureRequest{
Id: featureID,
Command: &featureproto.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -999,7 +999,7 @@ func listAutoOpsRulesByFeatureID(t *testing.T, client autoopsclient.Client, feat
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListAutoOpsRules(ctx, &autoopsproto.ListAutoOpsRulesRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: int64(500),
FeatureIds: []string{featureID},
})
@@ -1016,7 +1016,7 @@ func getAutoOpsRules(t *testing.T, id string) *autoopsproto.AutoOpsRule {
c := newAutoOpsClient(t)
defer c.Close()
resp, err := c.GetAutoOpsRule(ctx, &autoopsproto.GetAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -1030,7 +1030,7 @@ func deleteAutoOpsRules(t *testing.T, client autoopsclient.Client, id string) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err := client.DeleteAutoOpsRule(ctx, &autoopsproto.DeleteAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &autoopsproto.DeleteAutoOpsRuleCommand{},
})
@@ -1058,7 +1058,7 @@ func TestStopAutoOpsRule(t *testing.T) {
}
stopAutoOpsRule(t, autoOpsClient, autoOpsRules[0].Id)
resp, err := autoOpsClient.GetAutoOpsRule(ctx, &autoopsproto.GetAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: autoOpsRules[0].Id,
})
if resp == nil {
@@ -1075,7 +1075,7 @@ func stopAutoOpsRule(t *testing.T, client autoopsclient.Client, id string) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err := client.StopAutoOpsRule(ctx, &autoopsproto.StopAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &autoopsproto.StopAutoOpsRuleCommand{},
})
@@ -1089,7 +1089,7 @@ func updateAutoOpsRules(t *testing.T, client autoopsclient.Client, id string, da
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err := client.UpdateAutoOpsRule(ctx, &autoopsproto.UpdateAutoOpsRuleRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
AddDatetimeClauseCommands: []*autoopsproto.AddDatetimeClauseCommand{
{DatetimeClause: dateClause},
diff --git a/test/e2e/autoops/progressive_rollout_test.go b/test/e2e/autoops/progressive_rollout_test.go
index 03cc970ef2..3f97148b2f 100644
--- a/test/e2e/autoops/progressive_rollout_test.go
+++ b/test/e2e/autoops/progressive_rollout_test.go
@@ -157,7 +157,7 @@ func TestStopProgressiveRollout(t *testing.T) {
}
stopProgressiveRollout(t, autoOpsClient, progressiveRollouts[0].Id)
resp, err := autoOpsClient.GetProgressiveRollout(ctx, &autoopsproto.GetProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: progressiveRollouts[0].Id,
})
assert.NoError(t, err)
@@ -196,7 +196,7 @@ func TestDeleteProgressiveRollout(t *testing.T) {
}
deleteProgressiveRollout(t, autoOpsClient, progressiveRollouts[0].Id)
resp, err := autoOpsClient.GetProgressiveRollout(ctx, &autoopsproto.GetProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: progressiveRollouts[0].Id,
})
if resp != nil {
@@ -240,7 +240,7 @@ func TestExecuteProgressiveRollout(t *testing.T) {
}
clause := unmarshalProgressiveRolloutManualClause(t, progressiveRollouts[0].Clause)
_, err := autoOpsClient.ExecuteProgressiveRollout(ctx, &autoopsproto.ExecuteProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: progressiveRollouts[0].Id,
ChangeProgressiveRolloutTriggeredAtCommand: &autoopsproto.ChangeProgressiveRolloutScheduleTriggeredAtCommand{
ScheduleId: clause.Schedules[0].ScheduleId,
@@ -374,7 +374,7 @@ func createProgressiveRollout(
ProgressiveRolloutTemplateScheduleClause: template,
}
_, err := client.CreateProgressiveRollout(ctx, &autoopsproto.CreateProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Command: cmd,
})
if err != nil {
@@ -387,7 +387,7 @@ func listProgressiveRollouts(t *testing.T, client autoopsclient.Client, featureI
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListProgressiveRollouts(ctx, &autoopsproto.ListProgressiveRolloutsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: 0,
FeatureIds: []string{featureID},
})
@@ -430,7 +430,7 @@ func getProgressiveRollout(t *testing.T, id string) *autoopsproto.ProgressiveRol
c := newAutoOpsClient(t)
defer c.Close()
resp, err := c.GetProgressiveRollout(ctx, &autoopsproto.GetProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -444,7 +444,7 @@ func stopProgressiveRollout(t *testing.T, client autoopsclient.Client, id string
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err := client.StopProgressiveRollout(ctx, &autoopsproto.StopProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &autoopsproto.StopProgressiveRolloutCommand{
StoppedBy: autoopsproto.ProgressiveRollout_USER,
@@ -460,7 +460,7 @@ func deleteProgressiveRollout(t *testing.T, client autoopsclient.Client, id stri
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err := client.DeleteProgressiveRollout(ctx, &autoopsproto.DeleteProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &autoopsproto.DeleteProgressiveRolloutCommand{},
})
diff --git a/test/e2e/coderef/code_reference_test.go b/test/e2e/coderef/code_reference_test.go
new file mode 100644
index 0000000000..29d14855cd
--- /dev/null
+++ b/test/e2e/coderef/code_reference_test.go
@@ -0,0 +1,412 @@
+// Copyright 2025 The Bucketeer Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package coderef
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/golang/protobuf/ptypes/wrappers"
+ "github.com/stretchr/testify/assert"
+
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+
+ featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client"
+ rpcclient "github.com/bucketeer-io/bucketeer/pkg/rpc/client"
+ coderefproto "github.com/bucketeer-io/bucketeer/proto/coderef"
+ featureproto "github.com/bucketeer-io/bucketeer/proto/feature"
+)
+
+const (
+ timeout = 60 * time.Second
+)
+
+var (
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ testID = flag.String("test-id", "", "test ID")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+)
+
+func TestCreateCodeReference(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create code reference
+ createReq := newCreateCodeReferenceRequest(t, featureID)
+ resp := createCodeReference(t, client, createReq)
+
+ assert.Equal(t, createReq.FeatureId, resp.CodeReference.FeatureId)
+ assert.Equal(t, createReq.FilePath, resp.CodeReference.FilePath)
+ assert.Equal(t, createReq.LineNumber, resp.CodeReference.LineNumber)
+ assert.Equal(t, createReq.CodeSnippet, resp.CodeReference.CodeSnippet)
+ assert.Equal(t, createReq.RepositoryName, resp.CodeReference.RepositoryName)
+ assert.Equal(t, createReq.RepositoryOwner, resp.CodeReference.RepositoryOwner)
+ assert.Equal(t, createReq.RepositoryType, resp.CodeReference.RepositoryType)
+ assert.Equal(t, createReq.RepositoryBranch, resp.CodeReference.RepositoryBranch)
+ assert.Equal(t, createReq.CommitHash, resp.CodeReference.CommitHash)
+ assert.NotEmpty(t, resp.CodeReference.Id)
+}
+
+func TestUpdateCodeReference(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create code reference
+ createReq := newCreateCodeReferenceRequest(t, featureID)
+ createResp := createCodeReference(t, client, createReq)
+
+ // Update code reference
+ updateReq := &coderefproto.UpdateCodeReferenceRequest{
+ Id: createResp.CodeReference.Id,
+ EnvironmentId: *environmentID,
+ FilePath: "updated/path/to/file.go",
+ LineNumber: 200,
+ CodeSnippet: "updated code snippet",
+ ContentHash: "updated-hash-123",
+ RepositoryName: createResp.CodeReference.RepositoryName,
+ RepositoryOwner: createResp.CodeReference.RepositoryOwner,
+ RepositoryType: createResp.CodeReference.RepositoryType,
+ RepositoryBranch: createResp.CodeReference.RepositoryBranch,
+ CommitHash: createResp.CodeReference.CommitHash,
+ }
+ _, err := client.UpdateCodeReference(context.Background(), updateReq)
+ assert.NoError(t, err)
+
+ // Get and verify update
+ getResp := getCodeReference(t, client, &coderefproto.GetCodeReferenceRequest{
+ Id: createResp.CodeReference.Id,
+ EnvironmentId: *environmentID,
+ })
+ assert.Equal(t, updateReq.FilePath, getResp.CodeReference.FilePath)
+ assert.Equal(t, updateReq.LineNumber, getResp.CodeReference.LineNumber)
+ assert.Equal(t, updateReq.CodeSnippet, getResp.CodeReference.CodeSnippet)
+ assert.Equal(t, updateReq.ContentHash, getResp.CodeReference.ContentHash)
+ assert.Equal(t, updateReq.RepositoryName, getResp.CodeReference.RepositoryName)
+ assert.Equal(t, updateReq.RepositoryOwner, getResp.CodeReference.RepositoryOwner)
+ assert.Equal(t, updateReq.RepositoryType, getResp.CodeReference.RepositoryType)
+ assert.Equal(t, updateReq.RepositoryBranch, getResp.CodeReference.RepositoryBranch)
+ assert.Equal(t, updateReq.CommitHash, getResp.CodeReference.CommitHash)
+}
+
+func TestListCodeReferences(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create multiple code references
+ createReq1 := newCreateCodeReferenceRequest(t, featureID)
+ resp1 := createCodeReference(t, client, createReq1)
+ time.Sleep(time.Second)
+ createReq2 := newCreateCodeReferenceRequest(t, featureID)
+ resp2 := createCodeReference(t, client, createReq2)
+
+ // List code references
+ listReq := &coderefproto.ListCodeReferencesRequest{
+ FeatureId: featureID,
+ EnvironmentId: *environmentID,
+ PageSize: 10,
+ Cursor: "0",
+ OrderBy: coderefproto.ListCodeReferencesRequest_CREATED_AT,
+ OrderDirection: coderefproto.ListCodeReferencesRequest_DESC,
+ }
+ listResp, err := client.ListCodeReferences(context.Background(), listReq)
+ assert.NoError(t, err)
+
+ // Verify the created code references are in the response
+ found1, found2 := false, false
+ for _, ref := range listResp.CodeReferences {
+ if ref.Id == resp1.CodeReference.Id {
+ found1 = true
+ assert.Equal(t, createReq1.FeatureId, ref.FeatureId)
+ assert.Equal(t, createReq1.FilePath, ref.FilePath)
+ assert.Equal(t, createReq1.LineNumber, ref.LineNumber)
+ assert.Equal(t, createReq1.CodeSnippet, ref.CodeSnippet)
+ assert.Equal(t, createReq1.RepositoryName, ref.RepositoryName)
+ assert.Equal(t, createReq1.RepositoryOwner, ref.RepositoryOwner)
+ assert.Equal(t, createReq1.RepositoryType, ref.RepositoryType)
+ assert.Equal(t, createReq1.RepositoryBranch, ref.RepositoryBranch)
+ assert.Equal(t, createReq1.CommitHash, ref.CommitHash)
+ }
+ if ref.Id == resp2.CodeReference.Id {
+ found2 = true
+ assert.Equal(t, createReq2.FeatureId, ref.FeatureId)
+ assert.Equal(t, createReq2.FilePath, ref.FilePath)
+ assert.Equal(t, createReq2.LineNumber, ref.LineNumber)
+ assert.Equal(t, createReq2.CodeSnippet, ref.CodeSnippet)
+ assert.Equal(t, createReq2.RepositoryName, ref.RepositoryName)
+ assert.Equal(t, createReq2.RepositoryOwner, ref.RepositoryOwner)
+ assert.Equal(t, createReq2.RepositoryType, ref.RepositoryType)
+ assert.Equal(t, createReq2.RepositoryBranch, ref.RepositoryBranch)
+ assert.Equal(t, createReq2.CommitHash, ref.CommitHash)
+ }
+ }
+ assert.True(t, found1, "First created code reference not found in list response")
+ assert.True(t, found2, "Second created code reference not found in list response")
+}
+
+func TestListCodeReferencesCursor(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create multiple code references
+ for i := 0; i < 2; i++ {
+ createReq := newCreateCodeReferenceRequest(t, featureID)
+ createCodeReference(t, client, createReq)
+ time.Sleep(time.Second) // Ensure different creation times
+ }
+
+ expectedSize := 1
+ listReq := &coderefproto.ListCodeReferencesRequest{
+ FeatureId: featureID,
+ EnvironmentId: *environmentID,
+ PageSize: int64(expectedSize),
+ OrderBy: coderefproto.ListCodeReferencesRequest_CREATED_AT,
+ OrderDirection: coderefproto.ListCodeReferencesRequest_DESC,
+ }
+ listResp, err := client.ListCodeReferences(context.Background(), listReq)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if listResp.Cursor == "" {
+ t.Fatal("Cursor is empty")
+ }
+ actualSize := len(listResp.CodeReferences)
+ if expectedSize != actualSize {
+ t.Fatalf("Different sizes. Expected: %v, actual: %v", expectedSize, actualSize)
+ }
+
+ listResp, err = client.ListCodeReferences(context.Background(), &coderefproto.ListCodeReferencesRequest{
+ FeatureId: featureID,
+ EnvironmentId: *environmentID,
+ PageSize: int64(expectedSize),
+ Cursor: listResp.Cursor,
+ OrderBy: coderefproto.ListCodeReferencesRequest_CREATED_AT,
+ OrderDirection: coderefproto.ListCodeReferencesRequest_DESC,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ actualSize = len(listResp.CodeReferences)
+ if expectedSize != actualSize {
+ t.Fatalf("Different sizes. Expected: %v, actual: %v", expectedSize, actualSize)
+ }
+}
+
+func TestListCodeReferencesPageSize(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create multiple code references
+ for i := 0; i < 3; i++ {
+ createReq := newCreateCodeReferenceRequest(t, featureID)
+ createCodeReference(t, client, createReq)
+ time.Sleep(time.Second) // Ensure different creation times
+ }
+
+ expectedSize := 3
+ listReq := &coderefproto.ListCodeReferencesRequest{
+ FeatureId: featureID,
+ EnvironmentId: *environmentID,
+ PageSize: int64(expectedSize),
+ OrderBy: coderefproto.ListCodeReferencesRequest_CREATED_AT,
+ OrderDirection: coderefproto.ListCodeReferencesRequest_DESC,
+ }
+ listResp, err := client.ListCodeReferences(context.Background(), listReq)
+ if err != nil {
+ t.Fatal(err)
+ }
+ actualSize := len(listResp.CodeReferences)
+ if expectedSize != actualSize {
+ t.Fatalf("Different sizes. Expected: %v, actual: %v", expectedSize, actualSize)
+ }
+}
+
+func TestDeleteCodeReference(t *testing.T) {
+ t.Parallel()
+ client := newCodeRefClient(t)
+ featureClient := newFeatureClient(t)
+
+ // First create a feature
+ featureID := createFeatureID(t)
+ createFeature(t, featureClient, featureID)
+
+ // Create code reference
+ createReq := newCreateCodeReferenceRequest(t, featureID)
+ createResp := createCodeReference(t, client, createReq)
+
+ // Delete code reference
+ deleteReq := &coderefproto.DeleteCodeReferenceRequest{
+ Id: createResp.CodeReference.Id,
+ EnvironmentId: *environmentID,
+ }
+ _, err := client.DeleteCodeReference(context.Background(), deleteReq)
+ assert.NoError(t, err)
+
+ // Verify deletion
+ getReq := &coderefproto.GetCodeReferenceRequest{
+ Id: createResp.CodeReference.Id,
+ EnvironmentId: *environmentID,
+ }
+ _, err = client.GetCodeReference(context.Background(), getReq)
+ assert.Error(t, err)
+ assert.Contains(t, err.Error(), "not found") // Verify it's specifically a not found error
+ st, ok := status.FromError(err)
+ assert.True(t, ok)
+ assert.Equal(t, codes.NotFound, st.Code())
+}
+
+func newCreateCodeReferenceRequest(t *testing.T, featureID string) *coderefproto.CreateCodeReferenceRequest {
+ t.Helper()
+ return &coderefproto.CreateCodeReferenceRequest{
+ EnvironmentId: *environmentID,
+ FeatureId: featureID,
+ FilePath: "path/to/file.go",
+ LineNumber: 100,
+ CodeSnippet: "if (feature.enabled) { doSomething() }",
+ ContentHash: "abc123",
+ Aliases: []string{"test-alias"},
+ RepositoryName: "test-repo",
+ RepositoryOwner: "test-owner",
+ RepositoryType: coderefproto.CodeReference_GITHUB,
+ RepositoryBranch: "main",
+ CommitHash: "hash123",
+ }
+}
+
+func createCodeReference(
+ t *testing.T,
+ client coderefproto.CodeReferenceServiceClient,
+ req *coderefproto.CreateCodeReferenceRequest,
+) *coderefproto.CreateCodeReferenceResponse {
+ t.Helper()
+ resp, err := client.CreateCodeReference(context.Background(), req)
+ assert.NoError(t, err)
+ return resp
+}
+
+func getCodeReference(
+ t *testing.T,
+ client coderefproto.CodeReferenceServiceClient,
+ req *coderefproto.GetCodeReferenceRequest,
+) *coderefproto.GetCodeReferenceResponse {
+ t.Helper()
+ resp, err := client.GetCodeReference(context.Background(), req)
+ assert.NoError(t, err)
+ return resp
+}
+
+func newCodeRefClient(t *testing.T) coderefproto.CodeReferenceServiceClient {
+ t.Helper()
+ creds, err := rpcclient.NewPerRPCCredentials(*serviceTokenPath)
+ assert.NoError(t, err)
+ conn, err := rpcclient.NewClientConn(
+ fmt.Sprintf("%s:%d", *webGatewayAddr, *webGatewayPort),
+ *webGatewayCert,
+ rpcclient.WithPerRPCCredentials(creds),
+ rpcclient.WithDialTimeout(timeout),
+ rpcclient.WithBlock(),
+ )
+ assert.NoError(t, err)
+ return coderefproto.NewCodeReferenceServiceClient(conn)
+}
+
+func newFeatureClient(t *testing.T) featureclient.Client {
+ t.Helper()
+ creds, err := rpcclient.NewPerRPCCredentials(*serviceTokenPath)
+ assert.NoError(t, err)
+ featureClient, err := featureclient.NewClient(
+ fmt.Sprintf("%s:%d", *webGatewayAddr, *webGatewayPort),
+ *webGatewayCert,
+ rpcclient.WithPerRPCCredentials(creds),
+ rpcclient.WithDialTimeout(timeout),
+ rpcclient.WithBlock(),
+ )
+ assert.NoError(t, err)
+ return featureClient
+}
+
+func createFeatureID(t *testing.T) string {
+ t.Helper()
+ return fmt.Sprintf("feature-id-%d", time.Now().UnixNano())
+}
+
+func createFeature(t *testing.T, client featureclient.Client, featureID string) {
+ t.Helper()
+ cmd := &featureproto.CreateFeatureCommand{
+ Id: featureID,
+ Name: "e2e-test-feature",
+ Description: "e2e test feature",
+ Tags: []string{"e2e-test"},
+ Variations: []*featureproto.Variation{
+ {
+ Value: "true",
+ Name: "true",
+ Description: "this is a true variation",
+ },
+ {
+ Value: "false",
+ Name: "false",
+ Description: "this is a false variation",
+ },
+ },
+ DefaultOnVariationIndex: &wrappers.Int32Value{Value: int32(0)},
+ DefaultOffVariationIndex: &wrappers.Int32Value{Value: int32(1)},
+ }
+ createReq := &featureproto.CreateFeatureRequest{
+ Command: cmd,
+ EnvironmentId: *environmentID,
+ }
+ ctx, cancel := context.WithTimeout(context.Background(), timeout)
+ defer cancel()
+ _, err := client.CreateFeature(ctx, createReq)
+ assert.NoError(t, err)
+}
diff --git a/test/e2e/environment/environment_v2_test.go b/test/e2e/environment/environment_v2_test.go
index beaa89e287..cd8b28786f 100644
--- a/test/e2e/environment/environment_v2_test.go
+++ b/test/e2e/environment/environment_v2_test.go
@@ -33,18 +33,18 @@ const (
var (
// FIXME: To avoid compiling the test many times, webGatewayAddr, webGatewayPort & apiKey has been also added here to prevent from getting: "flag provided but not defined" error during the test. These 3 are being use in the Gateway test
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
const (
@@ -135,10 +135,10 @@ func TestUpdateEnvironmentV2(t *testing.T) {
func getEnvironmentID(t *testing.T) string {
t.Helper()
- if *environmentNamespace == "" {
+ if *environmentID == "" {
return "production"
}
- return *environmentNamespace
+ return *environmentID
}
func newEnvironmentClient(t *testing.T) environmentclient.Client {
diff --git a/test/e2e/eventcounter/eventcounter_test.go b/test/e2e/eventcounter/eventcounter_test.go
index e84ff27530..74fc097914 100644
--- a/test/e2e/eventcounter/eventcounter_test.go
+++ b/test/e2e/eventcounter/eventcounter_test.go
@@ -61,19 +61,19 @@ const (
const defaultVariationID = "default"
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
- compareFloatOpt = cmpopts.EquateApprox(0, 0.0001)
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
+ compareFloatOpt = cmpopts.EquateApprox(0, 0.0001)
)
func TestGrpcExperimentGoalCount(t *testing.T) {
@@ -1603,7 +1603,7 @@ func createGoals(ctx context.Context, t *testing.T, client experimentclient.Clie
}
_, err := client.CreateGoal(ctx, &experimentproto.CreateGoalRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -1633,13 +1633,13 @@ func createExperimentWithMultiGoals(
}
resp, err := client.CreateExperiment(ctx, &experimentproto.CreateExperimentRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
}
_, err = client.StartExperiment(ctx, &experimentproto.StartExperimentRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: resp.Experiment.Id,
Command: &experimentproto.StartExperimentCommand{},
})
@@ -2055,7 +2055,7 @@ func createFeature(
cmd := newCreateFeatureCommand(featureID, []string{variationA, variationB})
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -2073,7 +2073,7 @@ func addTag(t *testing.T, tag string, featureID string, client featureclient.Cli
AddTagCommands: []*featureproto.AddTagCommand{
{Tag: tag},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -2087,7 +2087,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &featureproto.EnableFeatureRequest{
Id: featureID,
Command: &featureproto.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -2111,7 +2111,7 @@ func addFeatureIndividualTargeting(t *testing.T, featureID, userID, variationID
Command: cmd,
},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
From: featureproto.UpdateFeatureTargetingRequest_USER,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
@@ -2157,7 +2157,7 @@ func getExperiment(t *testing.T, c experimentclient.Client, id string) (*experim
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
req := &experimentproto.GetExperimentRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
}
var response *experimentproto.GetExperimentResponse
@@ -2187,7 +2187,7 @@ func getExperimentResult(t *testing.T, c ecclient.Client, experimentID string) (
defer cancel()
req := &ecproto.GetExperimentResultRequest{
ExperimentId: experimentID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
var response *ecproto.GetExperimentResultResponse
var err error
@@ -2219,7 +2219,7 @@ func getExperimentEvaluationCount(
defer cancel()
now := time.Now()
req := &ecproto.GetExperimentEvaluationCountRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
StartAt: now.Add(-30 * 24 * time.Hour).Unix(),
EndAt: now.Unix(),
FeatureId: featureID,
@@ -2256,7 +2256,7 @@ func getExperimentGoalCount(
defer cancel()
now := time.Now()
req := &ecproto.GetExperimentGoalCountRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
StartAt: now.Add(-30 * 24 * time.Hour).Unix(),
EndAt: now.Unix(),
GoalId: goalID,
@@ -2290,7 +2290,7 @@ func getFeature(t *testing.T, client featureclient.Client, featureID string) (*f
t.Helper()
getReq := &featureproto.GetFeatureRequest{
Id: featureID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -2322,7 +2322,7 @@ func getEvaluationTimeseriesCount(
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
req := &ecproto.GetEvaluationTimeseriesCountRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
FeatureId: featureID,
TimeRange: timeRange,
}
diff --git a/test/e2e/experiment/experiment_test.go b/test/e2e/experiment/experiment_test.go
index 98f0623557..b0f8356ca6 100644
--- a/test/e2e/experiment/experiment_test.go
+++ b/test/e2e/experiment/experiment_test.go
@@ -24,6 +24,8 @@ import (
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes/wrappers"
+ "github.com/stretchr/testify/assert"
+ "google.golang.org/protobuf/types/known/wrapperspb"
experimentclient "github.com/bucketeer-io/bucketeer/pkg/experiment/client"
featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client"
@@ -41,18 +43,18 @@ const (
var (
// FIXME: To avoid compiling the test many times, webGatewayAddr, webGatewayPort & apiKey has been also added here to prevent from getting: "flag provided but not defined" error during the test. These 3 are being use in the Gateway test
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
func TestCreateAndGetExperiment(t *testing.T) {
@@ -70,7 +72,7 @@ func TestCreateAndGetExperiment(t *testing.T) {
expected := createExperimentWithMultiGoals(ctx, t, c, featureID, feature.Variations[0].Id, goalIDs, startAt, stopAt)
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -98,7 +100,7 @@ func TestListExperiments(t *testing.T) {
for _, e := range expectedExps {
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: e.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -124,13 +126,13 @@ func TestStopExperiment(t *testing.T) {
if _, err := c.StopExperiment(ctx, &experimentproto.StopExperimentRequest{
Id: e.Id,
Command: &experimentproto.StopExperimentCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}); err != nil {
t.Fatal(err)
}
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: e.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -156,13 +158,13 @@ func TestArchiveExperiment(t *testing.T) {
if _, err := c.ArchiveExperiment(ctx, &experimentproto.ArchiveExperimentRequest{
Id: e.Id,
Command: &experimentproto.ArchiveExperimentCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}); err != nil {
t.Fatal(err)
}
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: e.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -188,13 +190,13 @@ func TestDeleteExperiment(t *testing.T) {
if _, err := c.DeleteExperiment(ctx, &experimentproto.DeleteExperimentRequest{
Id: e.Id,
Command: &experimentproto.DeleteExperimentCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}); err != nil {
t.Fatal(err)
}
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: e.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -223,13 +225,13 @@ func TestUpdateExperiment(t *testing.T) {
if _, err := c.UpdateExperiment(ctx, &experimentproto.UpdateExperimentRequest{
Id: e.Id,
ChangeExperimentPeriodCommand: &experimentproto.ChangeExperimentPeriodCommand{StartAt: startAt.Unix(), StopAt: stopAt.Unix()},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}); err != nil {
t.Fatal(err)
}
getResp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: e.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -253,7 +255,7 @@ func TestCreateAndGetGoal(t *testing.T) {
expectedDescription := fmt.Sprintf("%s-goal-description", goalID)
getResp, err := c.GetGoal(ctx, &experimentproto.GetGoalRequest{
Id: goalID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -283,7 +285,7 @@ func TestListGoalsCursor(t *testing.T) {
expectedSize := 1
listResp, err := c.ListGoals(ctx, &experimentproto.ListGoalsRequest{
PageSize: int64(expectedSize),
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -298,7 +300,7 @@ func TestListGoalsCursor(t *testing.T) {
listResp, err = c.ListGoals(ctx, &experimentproto.ListGoalsRequest{
PageSize: int64(expectedSize),
Cursor: listResp.Cursor,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -319,7 +321,7 @@ func TestListGoalsPageSize(t *testing.T) {
expectedSize := 3
listResp, err := c.ListGoals(ctx, &experimentproto.ListGoalsRequest{
PageSize: int64(expectedSize),
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -343,14 +345,14 @@ func TestUpdateGoal(t *testing.T) {
Id: goalID,
RenameCommand: &experimentproto.RenameGoalCommand{Name: expectedName},
ChangeDescriptionCommand: &experimentproto.ChangeDescriptionGoalCommand{Description: expectedDescription},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
}
getResp, err := c.GetGoal(ctx, &experimentproto.GetGoalRequest{
Id: goalID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -380,14 +382,14 @@ func TestArchiveGoal(t *testing.T) {
_, err := c.ArchiveGoal(ctx, &experimentproto.ArchiveGoalRequest{
Id: goalID,
Command: &experimentproto.ArchiveGoalCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
}
getResp, err := c.GetGoal(ctx, &experimentproto.GetGoalRequest{
Id: goalID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -406,22 +408,16 @@ func TestDeleteGoal(t *testing.T) {
goalID := createGoal(ctx, t, c)
_, err := c.DeleteGoal(ctx, &experimentproto.DeleteGoalRequest{
Id: goalID,
- Command: &experimentproto.DeleteGoalCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
}
- getResp, err := c.GetGoal(ctx, &experimentproto.GetGoalRequest{
+ _, err = c.GetGoal(ctx, &experimentproto.GetGoalRequest{
Id: goalID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
- if err != nil {
- t.Fatal(err)
- }
- if !getResp.Goal.Deleted {
- t.Fatal("Goal deleted flag is false")
- }
+ assert.Equal(t, err.Error(), "rpc error: code = NotFound desc = experiment: not found")
}
func TestStatusUpdateFromWaitingToRunning(t *testing.T) {
@@ -439,7 +435,7 @@ func TestStatusUpdateFromWaitingToRunning(t *testing.T) {
expected := createExperimentWithMultiGoals(ctx, t, c, featureID, feature.Variations[0].Id, goalIDs, startAt, stopAt)
resp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -450,7 +446,7 @@ func TestStatusUpdateFromWaitingToRunning(t *testing.T) {
for i := 0; i < retryTimes; i++ {
resp, err = c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -481,7 +477,7 @@ func TestStatusUpdateFromRunningToStopped(t *testing.T) {
expected := createExperimentWithMultiGoals(ctx, t, c, featureID, feature.Variations[0].Id, goalIDs, startAt, stopAt)
resp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -492,13 +488,13 @@ func TestStatusUpdateFromRunningToStopped(t *testing.T) {
if _, err = c.StartExperiment(ctx, &experimentproto.StartExperimentRequest{
Id: expected.Id,
Command: &experimentproto.StartExperimentCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}); err != nil {
t.Fatal(err)
}
resp, err = c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if resp.Experiment.Status != experimentproto.Experiment_RUNNING {
t.Fatalf("Experiment status is not running. actual: %d", resp.Experiment.Status)
@@ -506,7 +502,7 @@ func TestStatusUpdateFromRunningToStopped(t *testing.T) {
for i := 0; i < retryTimes; i++ {
resp, err = c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -537,7 +533,7 @@ func TestStatusUpdateFromWaitingToStopped(t *testing.T) {
expected := createExperimentWithMultiGoals(ctx, t, c, featureID, feature.Variations[0].Id, goalIDs, startAt, stopAt)
resp, err := c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -548,7 +544,7 @@ func TestStatusUpdateFromWaitingToStopped(t *testing.T) {
for i := 0; i < retryTimes; i++ {
resp, err = c.GetExperiment(ctx, &experimentproto.GetExperimentRequest{
Id: expected.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -563,6 +559,109 @@ func TestStatusUpdateFromWaitingToStopped(t *testing.T) {
}
}
+func TestCreateListGoalsNoCommand(t *testing.T) {
+ t.Parallel()
+ ctx, cancel := context.WithTimeout(context.Background(), timeout)
+ defer cancel()
+ c := newExperimentClient(t)
+ defer c.Close()
+ goalID := createGoalID(t)
+ createGoalResp, err := c.CreateGoal(ctx, &experimentproto.CreateGoalRequest{
+ EnvironmentId: *environmentID,
+ Id: goalID,
+ Name: fmt.Sprintf("%s-goal-name", goalID),
+ Description: fmt.Sprintf("%s-goal-description", goalID),
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.NotNil(t, createGoalResp)
+
+ listGoalsResp, err := c.ListGoals(ctx, &experimentproto.ListGoalsRequest{
+ EnvironmentId: *environmentID,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ if listGoalsResp == nil || len(listGoalsResp.Goals) == 0 {
+ t.Fatal("No goals")
+ }
+
+ var pbGoal *experimentproto.Goal
+ for _, goal := range listGoalsResp.Goals {
+ if goal.Id == createGoalResp.Goal.Id {
+ pbGoal = goal
+ break
+ }
+ }
+ if pbGoal == nil {
+ t.Fatalf("Goal not found: %s", createGoalResp.Goal.Id)
+ }
+ assert.Equal(t, createGoalResp.Goal.Id, pbGoal.Id)
+ assert.Equal(t, createGoalResp.Goal.Name, pbGoal.Name)
+ assert.Equal(t, createGoalResp.Goal.Description, pbGoal.Description)
+
+ _, err = c.DeleteGoal(ctx, &experimentproto.DeleteGoalRequest{
+ Id: goalID,
+ EnvironmentId: *environmentID,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestCreateUpdateGoalNoCommand(t *testing.T) {
+ t.Parallel()
+ ctx, cancel := context.WithTimeout(context.Background(), timeout)
+ defer cancel()
+ c := newExperimentClient(t)
+ defer c.Close()
+ goalID := createGoalID(t)
+ createGoalResp, err := c.CreateGoal(ctx, &experimentproto.CreateGoalRequest{
+ EnvironmentId: *environmentID,
+ Id: goalID,
+ Name: fmt.Sprintf("%s-goal-name", goalID),
+ Description: fmt.Sprintf("%s-goal-description", goalID),
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.NotNil(t, createGoalResp)
+
+ expectedName := fmt.Sprintf("%s-goal-new-name-%s", prefixTestName, newUUID(t))
+ expectedDescription := fmt.Sprintf("%s-goal-new-description-%s", prefixTestName, newUUID(t))
+ updateGoalResp, err := c.UpdateGoal(ctx, &experimentproto.UpdateGoalRequest{
+ EnvironmentId: *environmentID,
+ Id: goalID,
+ Name: wrapperspb.String(expectedName),
+ Description: wrapperspb.String(expectedDescription),
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.NotNil(t, createGoalResp)
+
+ assert.Equal(t, expectedName, updateGoalResp.Goal.Name)
+ assert.Equal(t, expectedDescription, updateGoalResp.Goal.Description)
+
+ getGoalResp, err := c.GetGoal(ctx, &experimentproto.GetGoalRequest{
+ Id: goalID,
+ EnvironmentId: *environmentID,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.NotNil(t, getGoalResp)
+
+ assert.Equal(t, expectedName, getGoalResp.Goal.Name)
+ assert.Equal(t, expectedDescription, getGoalResp.Goal.Description)
+
+ _, err = c.DeleteGoal(ctx, &experimentproto.DeleteGoalRequest{
+ Id: goalID,
+ EnvironmentId: *environmentID,
+ })
+}
+
func createGoal(ctx context.Context, t *testing.T, client experimentclient.Client) string {
t.Helper()
goalID := createGoalID(t)
@@ -573,7 +672,7 @@ func createGoal(ctx context.Context, t *testing.T, client experimentclient.Clien
}
_, err := client.CreateGoal(ctx, &experimentproto.CreateGoalRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -624,7 +723,7 @@ func createExperimentWithMultiGoals(
}
resp, err := client.CreateExperiment(ctx, &experimentproto.CreateExperimentRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal(err)
@@ -666,7 +765,7 @@ func getFeature(ctx context.Context, t *testing.T, featureID string) *featurepro
defer client.Close()
req := &featureproto.GetFeatureRequest{
Id: featureID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
resp, err := client.GetFeature(ctx, req)
if err != nil {
@@ -682,7 +781,7 @@ func createFeature(ctx context.Context, t *testing.T, featureID string) {
cmd := newCreateFeatureCommand(featureID)
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.CreateFeature(ctx, createReq); err != nil {
t.Fatal(err)
@@ -741,7 +840,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &featureproto.EnableFeatureRequest{
Id: featureID,
Command: &featureproto.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
diff --git a/test/e2e/feature/feature_flag_trigger_test.go b/test/e2e/feature/feature_flag_trigger_test.go
index 1a6da94875..cc7373fa4a 100644
--- a/test/e2e/feature/feature_flag_trigger_test.go
+++ b/test/e2e/feature/feature_flag_trigger_test.go
@@ -77,7 +77,7 @@ func TestUpdateFlagTrigger(t *testing.T) {
// Update flag trigger
updateFlagTriggerReq := &featureproto.UpdateFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
ChangeFlagTriggerDescriptionCommand: &featureproto.ChangeFlagTriggerDescriptionCommand{
Description: newTriggerDescription(t),
},
@@ -89,7 +89,7 @@ func TestUpdateFlagTrigger(t *testing.T) {
// Get flag trigger
getFlagTriggerReq := &featureproto.GetFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
resp := getFeatureFlagTrigger(t, client, getFlagTriggerReq)
if resp.FlagTrigger.Description != updateFlagTriggerReq.ChangeFlagTriggerDescriptionCommand.Description {
@@ -113,7 +113,7 @@ func TestDisableEnableFlagTrigger(t *testing.T) {
// Disable flag trigger
disableFlagTriggerReq := &featureproto.DisableFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
DisableFlagTriggerCommand: &featureproto.DisableFlagTriggerCommand{},
}
_, err := client.DisableFlagTrigger(context.Background(), disableFlagTriggerReq)
@@ -122,7 +122,7 @@ func TestDisableEnableFlagTrigger(t *testing.T) {
}
getFlagTriggerReq := &featureproto.GetFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
// Get flag trigger
resp := getFeatureFlagTrigger(t, client, getFlagTriggerReq)
@@ -132,7 +132,7 @@ func TestDisableEnableFlagTrigger(t *testing.T) {
// Enable flag trigger
enableFlagTriggerReq := &featureproto.EnableFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
EnableFlagTriggerCommand: &featureproto.EnableFlagTriggerCommand{},
}
_, err = client.EnableFlagTrigger(context.Background(), enableFlagTriggerReq)
@@ -162,7 +162,7 @@ func TestResetFlagTrigger(t *testing.T) {
// Reset flag trigger
resetFlagTriggerReq := &featureproto.ResetFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
ResetFlagTriggerCommand: &featureproto.ResetFlagTriggerCommand{},
}
resetResp, err := client.ResetFlagTrigger(context.Background(), resetFlagTriggerReq)
@@ -190,7 +190,7 @@ func TestDeleteFlagTrigger(t *testing.T) {
// Delete flag trigger
deleteFlagTriggerReq := &featureproto.DeleteFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
DeleteFlagTriggerCommand: &featureproto.DeleteFlagTriggerCommand{},
}
_, err := client.DeleteFlagTrigger(context.Background(), deleteFlagTriggerReq)
@@ -200,7 +200,7 @@ func TestDeleteFlagTrigger(t *testing.T) {
// Get flag trigger
getFlagTriggerReq := &featureproto.GetFlagTriggerRequest{
Id: createResp.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
_, err = client.GetFlagTrigger(context.Background(), getFlagTriggerReq)
if err == nil {
@@ -216,7 +216,7 @@ func TestListFlagTriggers(t *testing.T) {
createFeature(t, client, command)
// Create flag triggers
trigger1, err := client.CreateFlagTrigger(context.Background(), &featureproto.CreateFlagTriggerRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
CreateFlagTriggerCommand: newCreateFlagTriggerCmd(
command.Id,
newTriggerDescription(t),
@@ -228,7 +228,7 @@ func TestListFlagTriggers(t *testing.T) {
}
time.Sleep(1 * time.Second)
trigger2, err := client.CreateFlagTrigger(context.Background(), &featureproto.CreateFlagTriggerRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
CreateFlagTriggerCommand: newCreateFlagTriggerCmd(
command.Id,
newTriggerDescription(t),
@@ -241,7 +241,7 @@ func TestListFlagTriggers(t *testing.T) {
// List flag triggers
listFlagTriggersReq := &featureproto.ListFlagTriggersRequest{
FeatureId: command.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Cursor: "0",
PageSize: 10,
OrderBy: featureproto.ListFlagTriggersRequest_CREATED_AT,
@@ -284,7 +284,7 @@ func TestFeatureFlagWebhook(t *testing.T) {
createFeature(t, client, command)
// Create Enable flag triggers
enableTrigger, err := client.CreateFlagTrigger(context.Background(), &featureproto.CreateFlagTriggerRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
CreateFlagTriggerCommand: newCreateFlagTriggerCmd(
command.Id,
newTriggerDescription(t),
@@ -309,7 +309,7 @@ func TestFeatureFlagWebhook(t *testing.T) {
}
enabledTrigger := getFeatureFlagTrigger(t, client, &featureproto.GetFlagTriggerRequest{
Id: enableTrigger.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if enabledTrigger.FlagTrigger.TriggerCount != 1 {
t.Fatalf("unexpected trigger times: %d", enabledTrigger.FlagTrigger.TriggerCount)
@@ -319,7 +319,7 @@ func TestFeatureFlagWebhook(t *testing.T) {
}
// Create Disable flag triggers
disableTrigger, err := client.CreateFlagTrigger(context.Background(), &featureproto.CreateFlagTriggerRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
CreateFlagTriggerCommand: newCreateFlagTriggerCmd(
command.Id,
newTriggerDescription(t),
@@ -344,7 +344,7 @@ func TestFeatureFlagWebhook(t *testing.T) {
}
disabledTrigger := getFeatureFlagTrigger(t, client, &featureproto.GetFlagTriggerRequest{
Id: disableTrigger.FlagTrigger.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if disabledTrigger.FlagTrigger.TriggerCount != 1 {
t.Fatalf("unexpected trigger times: %d", disabledTrigger.FlagTrigger.TriggerCount)
@@ -407,7 +407,7 @@ func createFeatureFlagTrigger(
) *featureproto.CreateFlagTriggerResponse {
t.Helper()
resp, err := client.CreateFlagTrigger(context.Background(), &featureproto.CreateFlagTriggerRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
CreateFlagTriggerCommand: cmd,
})
if err != nil {
diff --git a/test/e2e/feature/feature_test.go b/test/e2e/feature/feature_test.go
index a9257c3cb1..cc26fd29e0 100644
--- a/test/e2e/feature/feature_test.go
+++ b/test/e2e/feature/feature_test.go
@@ -47,18 +47,18 @@ const (
var (
// FIXME: To avoid compiling the test many times, webGatewayAddr, webGatewayPort & apiKey has been also added here to prevent from getting: "flag provided but not defined" error during the test. These 3 are being use in the Gateway test
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- testID = flag.String("test-id", "", "test ID")
- organizationID = flag.String("organization-id", "", "Organization ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ testID = flag.String("test-id", "", "test ID")
+ organizationID = flag.String("organization-id", "", "Organization ID")
tags = []string{"e2e-test-tag-1", "e2e-test-tag-2", "e2e-test-tag-3"}
)
@@ -108,7 +108,7 @@ func TestArchiveFeature(t *testing.T) {
req := &feature.ArchiveFeatureRequest{
Id: featureID,
Command: &feature.ArchiveFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -135,7 +135,7 @@ func TestUnarchiveFeature(t *testing.T) {
req := &feature.ArchiveFeatureRequest{
Id: featureID,
Command: &feature.ArchiveFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.ArchiveFeature(ctx, req); err != nil {
t.Fatal(err)
@@ -143,7 +143,7 @@ func TestUnarchiveFeature(t *testing.T) {
reqUnarchive := &feature.UnarchiveFeatureRequest{
Id: featureID,
Command: &feature.UnarchiveFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.UnarchiveFeature(ctx, reqUnarchive); err != nil {
t.Fatal(err)
@@ -166,7 +166,7 @@ func TestDeleteFeature(t *testing.T) {
deleteReq := &feature.DeleteFeatureRequest{
Id: featureID,
Command: &feature.DeleteFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -310,7 +310,7 @@ func TestDisableFeature(t *testing.T) {
disableReq := &feature.DisableFeatureRequest{
Id: cmd.Id,
Command: &feature.DisableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.DisableFeature(ctx, disableReq); err != nil {
t.Fatal(err)
@@ -387,7 +387,7 @@ func TestListArchivedFeatures(t *testing.T) {
req := &feature.ArchiveFeatureRequest{
Id: featureID,
Command: &feature.ArchiveFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -397,7 +397,7 @@ func TestListArchivedFeatures(t *testing.T) {
listReq := &feature.ListFeaturesRequest{
PageSize: size,
Archived: &wrappers.BoolValue{Value: true},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
response, err := client.ListFeatures(ctx, listReq)
if err != nil {
@@ -416,7 +416,7 @@ func TestListFeaturesPageSize(t *testing.T) {
createRandomIDFeatures(t, 2, client)
listReq := &feature.ListFeaturesRequest{
PageSize: size,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -437,7 +437,7 @@ func TestListFeaturesCursor(t *testing.T) {
size := int64(1)
listReq := &feature.ListFeaturesRequest{
PageSize: size,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -452,7 +452,7 @@ func TestListFeaturesCursor(t *testing.T) {
listReq = &feature.ListFeaturesRequest{
PageSize: size,
Cursor: response.Cursor,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
response, err = client.ListFeatures(ctx, listReq)
if err != nil {
@@ -488,7 +488,7 @@ func TestListFeaturesOrderByName(t *testing.T) {
PageSize: size,
OrderBy: feature.ListFeaturesRequest_NAME,
OrderDirection: tc.orderDirection,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -531,7 +531,7 @@ func TestListFeaturesOrderByCreatedAt(t *testing.T) {
PageSize: size,
OrderBy: feature.ListFeaturesRequest_CREATED_AT,
OrderDirection: tc.orderDirection,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -574,7 +574,7 @@ func TestListFeaturesOrderByUpdatedAt(t *testing.T) {
PageSize: size,
OrderBy: feature.ListFeaturesRequest_UPDATED_AT,
OrderDirection: tc.orderDirection,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -601,7 +601,7 @@ func TestListEnabledFeaturesPageSize(t *testing.T) {
size := int64(2)
listReq := &feature.ListEnabledFeaturesRequest{
PageSize: size,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -625,7 +625,7 @@ func TestListEnabledFeaturesCursor(t *testing.T) {
size := int64(2)
listReq := &feature.ListEnabledFeaturesRequest{
PageSize: size,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -645,7 +645,7 @@ func TestListEnabledFeaturesCursor(t *testing.T) {
listReq = &feature.ListEnabledFeaturesRequest{
PageSize: size,
Cursor: response.Cursor,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
response, err = client.ListEnabledFeatures(ctx, listReq)
if err != nil {
@@ -668,7 +668,7 @@ func TestRename(t *testing.T) {
updateReq := &feature.UpdateFeatureDetailsRequest{
Id: cmd.Id,
RenameFeatureCommand: &feature.RenameFeatureCommand{Name: expected},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -693,7 +693,7 @@ func TestChangeDescription(t *testing.T) {
updateReq := &feature.UpdateFeatureDetailsRequest{
Id: cmd.Id,
ChangeDescriptionCommand: &feature.ChangeDescriptionCommand{Description: expected},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -722,7 +722,7 @@ func TestAddTags(t *testing.T) {
{Tag: newTags[1]},
{Tag: newTags[2]},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -751,7 +751,7 @@ func TestRemoveTags(t *testing.T) {
removeReq := &feature.UpdateFeatureDetailsRequest{
Id: cmd.Id,
RemoveTagCommands: removeTargetTags,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1448,14 +1448,14 @@ func TestCloneFeature(t *testing.T) {
targetEnvironmentId := newUUID(t)
c := newEnvironmentClient(t)
defer c.Close()
- envCmd := newEnvironmentCommand(targetEnvironmentNamespace)
+ envCmd := newEnvironmentCommand(targetenvironmentId)
createEnvironment(t, c, envCmd)
req := &feature.CloneFeatureRequest{
Id: featureID,
Command: &feature.CloneFeatureCommand{
- EnvironmentNamespace: targetEnvironmentNamespace,
+ environmentId: targetenvironmentId,
},
- EnvironmentNamespace: *environmentNamespace,
+ environmentId: *environmentId,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1463,7 +1463,7 @@ func TestCloneFeature(t *testing.T) {
t.Fatal(err)
}
f = getFeature(t, featureID, client)
- cf := getClonedFeature(t, featureID, targetEnvironmentNamespace, client)
+ cf := getClonedFeature(t, featureID, targetenvironmentId, client)
if cf.Id != f.Id {
t.Fatalf("Different ids. Expected: %s actual: %s", f.Id, cf.Id)
}
@@ -1543,23 +1543,23 @@ func TestCloneFeature(t *testing.T) {
})
require.NoError(t, err)
updateFeatureTargeting(t, client, changeCmd, featureID)
- anotherTargetEnvironmentNamespace := newUUID(t)
+ anotherTargetenvironmentId := newUUID(t)
c = newEnvironmentClient(t)
defer c.Close()
- envCmd = newEnvironmentCommand(anotherTargetEnvironmentNamespace)
+ envCmd = newEnvironmentCommand(anotherTargetenvironmentId)
createEnvironment(t, c, envCmd)
req = &feature.CloneFeatureRequest{
Id: featureID,
Command: &feature.CloneFeatureCommand{
- EnvironmentNamespace: anotherTargetEnvironmentNamespace,
+ environmentId: anotherTargetenvironmentId,
},
- EnvironmentNamespace: *environmentNamespace,
+ environmentId: *environmentId,
}
if _, err := client.CloneFeature(ctx, req); err != nil {
t.Fatal(err)
}
f = getFeature(t, featureID, client)
- cf = getClonedFeature(t, featureID, anotherTargetEnvironmentNamespace, client)
+ cf = getClonedFeature(t, featureID, anotherTargetenvironmentId, client)
for i := range cf.Rules {
for idx := range cf.Rules[i].Strategy.RolloutStrategy.Variations {
if cf.Rules[i].Strategy.RolloutStrategy.Variations[idx].Weight != f.Rules[i].Strategy.RolloutStrategy.Variations[idx].Weight {
@@ -1733,7 +1733,7 @@ func createFeature(t *testing.T, client featureclient.Client, cmd *feature.Creat
t.Helper()
createReq := &feature.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1746,7 +1746,7 @@ func getFeature(t *testing.T, featureID string, client featureclient.Client) *fe
t.Helper()
getReq := &feature.GetFeatureRequest{
Id: featureID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1762,7 +1762,7 @@ func getClonedFeature(t *testing.T, featureID, en string, client featureclient.C
t.Helper()
getReq := &feature.GetFeatureRequest{
Id: featureID,
- EnvironmentNamespace: en,
+ environmentId: en,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1786,7 +1786,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &feature.EnableFeatureRequest{
Id: featureID,
Command: &feature.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1822,7 +1822,7 @@ func updateVariations(t *testing.T, featureID string, commands []*feature.Comman
updateReq := &feature.UpdateFeatureVariationsRequest{
Id: featureID,
Commands: commands,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1963,7 +1963,7 @@ func updateFeatureTargeting(t *testing.T, client featureclient.Client, cmd *any.
Commands: []*feature.Command{
{Command: cmd},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
From: feature.UpdateFeatureTargetingRequest_USER,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
@@ -1989,7 +1989,7 @@ func evaluateFeatures(t *testing.T, client featureclient.Client, userID, tag str
t.Helper()
req := &feature.EvaluateFeaturesRequest{
User: &userproto.User{Id: userID},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Tag: tag,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
@@ -2017,7 +2017,7 @@ func createProgressiveRollout(
ProgressiveRolloutTemplateScheduleClause: template,
}
_, err := client.CreateProgressiveRollout(ctx, &aoproto.CreateProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Command: cmd,
})
if err != nil {
@@ -2030,7 +2030,7 @@ func listProgressiveRollouts(t *testing.T, client aoclient.Client, featureID str
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListProgressiveRollouts(ctx, &aoproto.ListProgressiveRolloutsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: 0,
FeatureIds: []string{featureID},
})
@@ -2045,7 +2045,7 @@ func getProgressiveRollout(t *testing.T, client aoclient.Client, id string) *aop
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.GetProgressiveRollout(ctx, &aoproto.GetProgressiveRolloutRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -2097,8 +2097,8 @@ func newEnvironmentCommand(id string) *environment.CreateEnvironmentCommand {
namespace := strings.Replace(id, "-", "", -1)
return &environment.CreateEnvironmentCommand{
Namespace: namespace,
- Name: "e2e-test-environment-namespace",
- Description: "e2e-test-environment-namespace-description",
+ Name: "e2e-test-environment-id",
+ Description: "e2e-test-environment-id-description",
Id: id,
ProjectId: defaultProjectID,
}
diff --git a/test/e2e/feature/segment_test.go b/test/e2e/feature/segment_test.go
index 245f8e7452..21a0a3e890 100644
--- a/test/e2e/feature/segment_test.go
+++ b/test/e2e/feature/segment_test.go
@@ -39,14 +39,14 @@ func TestCreateListSegmentNoCommand(t *testing.T) {
defer cancel()
client := newFeatureClient(t)
createResp, err := client.CreateSegment(ctx, &featureproto.CreateSegmentRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: newSegmentName(t),
Description: fmt.Sprintf("%s-description", prefixSegment),
})
assert.NoError(t, err)
listResp, err := client.ListSegments(ctx, &featureproto.ListSegmentsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
assert.NotNil(t, listResp)
@@ -66,7 +66,7 @@ func TestCreateListSegmentNoCommand(t *testing.T) {
// delete segment
_, err = client.DeleteSegment(ctx, &featureproto.DeleteSegmentRequest{
Id: segment.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
}
@@ -76,7 +76,7 @@ func TestCreateUpdateNoCommand(t *testing.T) {
defer cancel()
client := newFeatureClient(t)
createResp, err := client.CreateSegment(ctx, &featureproto.CreateSegmentRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: newSegmentName(t),
Description: fmt.Sprintf("%s-description", prefixSegment),
})
@@ -86,7 +86,7 @@ func TestCreateUpdateNoCommand(t *testing.T) {
updateResp, err := client.UpdateSegment(ctx, &featureproto.UpdateSegmentRequest{
Id: createResp.Segment.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: wrapperspb.String(fmt.Sprintf("%s-update", segment.Name)),
})
assert.NoError(t, err)
@@ -98,7 +98,7 @@ func TestCreateUpdateNoCommand(t *testing.T) {
// delete segment
_, err = client.DeleteSegment(ctx, &featureproto.DeleteSegmentRequest{
Id: segment.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
}
@@ -113,7 +113,7 @@ func TestCreateSegment(t *testing.T) {
}
req := &featureproto.CreateSegmentRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.CreateSegment(ctx, req)
assert.NoError(t, err)
@@ -177,7 +177,7 @@ func TestChangeSegmentName(t *testing.T) {
Commands: []*featureproto.Command{
{Command: cmdChange},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
},
)
assert.NotNil(t, res)
@@ -200,7 +200,7 @@ func TestChangeSegmentName(t *testing.T) {
Commands: []*featureproto.Command{
{Command: cmdChange},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
},
)
assert.NotNil(t, res)
@@ -224,7 +224,7 @@ func TestChangeSegmentDescription(t *testing.T) {
Commands: []*featureproto.Command{
{Command: cmdChange},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
},
)
assert.NotNil(t, res)
@@ -243,7 +243,7 @@ func TestDeleteSegment(t *testing.T) {
&featureproto.DeleteSegmentRequest{
Id: id,
Command: &featureproto.DeleteSegmentCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
},
)
assert.NotNil(t, res)
@@ -262,7 +262,7 @@ func TestListSegmentsPageSize(t *testing.T) {
pageSize := int64(1)
res, err := client.ListSegments(ctx, &featureproto.ListSegmentsRequest{
PageSize: pageSize,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
assert.Equal(t, pageSize, int64(len(res.Segments)))
@@ -278,7 +278,7 @@ func TestListSegmentsCursor(t *testing.T) {
pageSize := int64(2)
res, err := client.ListSegments(ctx, &featureproto.ListSegmentsRequest{
PageSize: pageSize,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
assert.NotEmpty(t, res.Cursor)
@@ -287,7 +287,7 @@ func TestListSegmentsCursor(t *testing.T) {
&featureproto.ListSegmentsRequest{
PageSize: pageSize,
Cursor: res.Cursor,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
},
)
assert.NoError(t, err)
@@ -304,7 +304,7 @@ func getSegment(ctx context.Context, t *testing.T, client featureclient.Client,
t.Helper()
req := &featureproto.GetSegmentRequest{
Id: id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.GetSegment(ctx, req)
assert.NoError(t, err)
@@ -319,7 +319,7 @@ func createSegment(ctx context.Context, t *testing.T, client featureclient.Clien
}
req := &featureproto.CreateSegmentRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.CreateSegment(ctx, req)
assert.NoError(t, err)
diff --git a/test/e2e/feature/segment_user_test.go b/test/e2e/feature/segment_user_test.go
index ee830d1698..fef522c4bb 100644
--- a/test/e2e/feature/segment_user_test.go
+++ b/test/e2e/feature/segment_user_test.go
@@ -105,7 +105,7 @@ func TestListSegmentUsersPageSize(t *testing.T) {
PageSize: pageSize,
SegmentId: segmentID,
State: &wrappersproto.Int32Value{Value: int32(featureproto.SegmentUser_INCLUDED)},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
assert.Equal(t, pageSize, int64(len(res.Users)))
@@ -129,7 +129,7 @@ func TestListSegmentUsersCursor(t *testing.T) {
Cursor: cursor,
SegmentId: segmentID,
State: state,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
assert.NoError(t, err)
assert.NotEmpty(t, res.Cursor)
@@ -177,7 +177,7 @@ func TestBulkUploadAndDownloadSegmentUsers(t *testing.T) {
sort.Strings(uids)
userIDs := []byte(fmt.Sprintf("%s\n%s\n%s\n", uids[0], uids[1], uids[2]))
uploadRes, err := client.BulkUploadSegmentUsers(ctx, &featureproto.BulkUploadSegmentUsersRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
SegmentId: segmentID,
Command: &featureproto.BulkUploadSegmentUsersCommand{
Data: userIDs,
@@ -207,7 +207,7 @@ func addSegmentUser(ctx context.Context, t *testing.T, client featureclient.Clie
UserIds: userIDs,
State: state,
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.AddSegmentUser(ctx, req)
assert.NotNil(t, res)
@@ -221,7 +221,7 @@ func deleteSegmentUser(ctx context.Context, t *testing.T, client featureclient.C
UserIds: userIDs,
State: state,
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.DeleteSegmentUser(ctx, req)
assert.NotNil(t, res)
@@ -234,7 +234,7 @@ func getSegmentUser(ctx context.Context, t *testing.T, client featureclient.Clie
SegmentId: segmentID,
UserId: userID,
State: state,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.GetSegmentUser(ctx, req)
assert.NoError(t, err)
@@ -246,7 +246,7 @@ func listSegmentUsers(ctx context.Context, t *testing.T, client featureclient.Cl
req := &featureproto.ListSegmentUsersRequest{
SegmentId: segmentID,
State: state,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
res, err := client.ListSegmentUsers(ctx, req)
assert.NoError(t, err)
@@ -282,7 +282,7 @@ func bulkDownloadSegmentUsers(t *testing.T, client featureclient.Client, segment
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
return client.BulkDownloadSegmentUsers(ctx, &featureproto.BulkDownloadSegmentUsersRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
SegmentId: segmentID,
State: featureproto.SegmentUser_INCLUDED,
})
diff --git a/test/e2e/feature/tag_test.go b/test/e2e/feature/tag_test.go
index 2c7daffecd..1f165f5f37 100644
--- a/test/e2e/feature/tag_test.go
+++ b/test/e2e/feature/tag_test.go
@@ -86,7 +86,7 @@ func listTags(ctx context.Context, t *testing.T, client featureclient.Client) []
t.Helper()
resp, err := client.ListTags(ctx, &feature.ListTagsRequest{
PageSize: int64(500),
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal("failed to list tags", err)
@@ -101,7 +101,7 @@ func addTag(t *testing.T, tag string, featureID string, client featureclient.Cli
AddTagCommands: []*feature.AddTagCommand{
{Tag: tag},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
diff --git a/test/e2e/gateway/api_grpc_test.go b/test/e2e/gateway/api_grpc_test.go
index 95995b41c1..72f2d5fa18 100644
--- a/test/e2e/gateway/api_grpc_test.go
+++ b/test/e2e/gateway/api_grpc_test.go
@@ -49,18 +49,18 @@ const (
)
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
func TestAPIKey(t *testing.T) {
@@ -1075,7 +1075,7 @@ func createFeature(
t.Helper()
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1089,7 +1089,7 @@ func getFeature(t *testing.T, featureID string, client featureclient.Client) *fe
t.Helper()
getReq := &featureproto.GetFeatureRequest{
Id: featureID,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1107,7 +1107,7 @@ func addTag(t *testing.T, tag string, featureID string, client featureclient.Cli
AddTagCommands: []*featureproto.AddTagCommand{
{Tag: tag},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1128,7 +1128,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &featureproto.EnableFeatureRequest{
Id: featureID,
Command: &featureproto.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1142,7 +1142,7 @@ func archiveFeature(t *testing.T, featureID string, client featureclient.Client)
req := &featureproto.ArchiveFeatureRequest{
Id: featureID,
Command: &featureproto.ArchiveFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -1279,7 +1279,7 @@ func updateFeatureTargeting(t *testing.T, client featureclient.Client, cmd *any.
Commands: []*featureproto.Command{
{Command: cmd},
},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
From: featureproto.UpdateFeatureTargetingRequest_USER,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
diff --git a/test/e2e/notification/subscription_test.go b/test/e2e/notification/subscription_test.go
index 522c99cc7b..29757ca4ea 100644
--- a/test/e2e/notification/subscription_test.go
+++ b/test/e2e/notification/subscription_test.go
@@ -38,18 +38,18 @@ const (
)
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
)
func TestCreateListSubscriptionNoCommand(t *testing.T) {
@@ -108,7 +108,7 @@ func TestCreateListSubscriptionNoCommand(t *testing.T) {
t.Fatalf("Incorrect deleted. Expected: %t actual: %t", false, subscription.Disabled)
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -144,7 +144,7 @@ func TestCreateUpdateSubscriptionNoCommand(t *testing.T) {
proto.Subscription_DOMAIN_EVENT_ADMIN_ACCOUNT,
}
resp, err := notificationClient.UpdateSubscription(ctx, &proto.UpdateSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
SourceTypes: updatedSourceTypes,
Name: wrapperspb.String(updatedName),
@@ -177,7 +177,7 @@ func TestCreateUpdateSubscriptionNoCommand(t *testing.T) {
t.Fatalf("Incorrect deleted. Expected: %t actual: %t", false, subscription.Disabled)
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -207,7 +207,7 @@ func TestCreateGetDeleteSubscription(t *testing.T) {
}
createSubscription(ctx, t, notificationClient, name, sourceTypes, recipient)
resp, err := notificationClient.GetSubscription(ctx, &proto.GetSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -236,7 +236,7 @@ func TestCreateGetDeleteSubscription(t *testing.T) {
t.Fatalf("Incorrect deleted. Expected: %t actual: %t", false, subscription.Disabled)
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &proto.DeleteSubscriptionCommand{},
})
@@ -244,7 +244,7 @@ func TestCreateGetDeleteSubscription(t *testing.T) {
t.Fatal(err)
}
_, err = notificationClient.GetSubscription(ctx, &proto.GetSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -306,7 +306,7 @@ func TestCreateListDeleteSubscription(t *testing.T) {
t.Fatalf("Incorrect deleted. Expected: %t actual: %t", false, subscription.Disabled)
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &proto.DeleteSubscriptionCommand{},
})
@@ -314,7 +314,7 @@ func TestCreateListDeleteSubscription(t *testing.T) {
t.Fatal(err)
}
_, err = notificationClient.GetSubscription(ctx, &proto.GetSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -347,7 +347,7 @@ func TestUpdateSubscription(t *testing.T) {
}
createSubscription(ctx, t, notificationClient, name, sourceTypes, recipient)
_, err = notificationClient.UpdateSubscription(ctx, &proto.UpdateSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
AddSourceTypesCommand: &proto.AddSourceTypesCommand{
SourceTypes: []proto.Subscription_SourceType{
@@ -364,7 +364,7 @@ func TestUpdateSubscription(t *testing.T) {
t.Fatal(err)
}
resp, err := notificationClient.GetSubscription(ctx, &proto.GetSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -393,7 +393,7 @@ func TestUpdateSubscription(t *testing.T) {
t.Fatalf("Incorrect deleted. Expected: %t actual: %t", false, subscription.Disabled)
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &proto.DeleteSubscriptionCommand{},
})
@@ -401,7 +401,7 @@ func TestUpdateSubscription(t *testing.T) {
t.Fatal(err)
}
_, err = notificationClient.GetSubscription(ctx, &proto.GetSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
})
if err != nil {
@@ -434,7 +434,7 @@ func TestListEnabledSubscriptions(t *testing.T) {
}
createSubscription(ctx, t, notificationClient, name, sourceTypes, recipient)
_, err = notificationClient.DisableSubscription(ctx, &proto.DisableSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &proto.DisableSubscriptionCommand{},
})
@@ -457,7 +457,7 @@ func TestListEnabledSubscriptions(t *testing.T) {
t.Fatal("List enabled subscriptions include disabled subscription")
}
_, err = notificationClient.DeleteSubscription(ctx, &proto.DeleteSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Id: id,
Command: &proto.DeleteSubscriptionCommand{},
})
@@ -505,7 +505,7 @@ func createSubscription(
t.Helper()
cmd := newCreateSubscriptionCommand(name, sourceTypes, recipient)
createReq := &proto.CreateSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Command: cmd,
}
if _, err := client.CreateSubscription(ctx, createReq); err != nil {
@@ -533,7 +533,7 @@ func listSubscriptions(
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListSubscriptions(ctx, &proto.ListSubscriptionsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: int64(500),
SourceTypes: sourceTypes,
})
@@ -551,7 +551,7 @@ func listEnabledSubscriptions(
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListEnabledSubscriptions(ctx, &proto.ListEnabledSubscriptionsRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: int64(500),
SourceTypes: sourceTypes,
})
@@ -571,7 +571,7 @@ func createSubscriptionNoCommand(
t.Helper()
createReq := &proto.CreateSubscriptionRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: name,
SourceTypes: sourceTypes,
Recipient: recipient,
diff --git a/test/e2e/push/push_test.go b/test/e2e/push/push_test.go
index 79f86b4281..62eb07fba0 100644
--- a/test/e2e/push/push_test.go
+++ b/test/e2e/push/push_test.go
@@ -38,18 +38,18 @@ const (
)
var (
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- organizationID = flag.String("organization-id", "", "Organization ID")
- testID = flag.String("test-id", "", "test ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ organizationID = flag.String("organization-id", "", "Organization ID")
+ testID = flag.String("test-id", "", "test ID")
fcmServiceAccountDummy = `{
"type": "service_account",
@@ -183,7 +183,7 @@ func TestUpdatePush(t *testing.T) {
// Update the push
updateReq := &pushproto.UpdatePushRequest{
Id: push.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: &wrappers.StringValue{Value: newName},
Tags: []string{newTag},
Disabled: wrapperspb.Bool(true),
@@ -242,7 +242,7 @@ func createFeature(ctx context.Context, t *testing.T, client featureclient.Clien
cmd := newCreateFeatureCommand(featureID, tag)
createReq := &featureproto.CreateFeatureRequest{
Command: cmd,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
if _, err := client.CreateFeature(ctx, createReq); err != nil {
t.Fatal(err)
@@ -255,7 +255,7 @@ func enableFeature(t *testing.T, featureID string, client featureclient.Client)
enableReq := &featureproto.EnableFeatureRequest{
Id: featureID,
Command: &featureproto.EnableFeatureCommand{},
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@@ -325,7 +325,7 @@ func createPush(
t.Helper()
cmd := newCreatePushCommand(t, fcmServiceAccount, []string{tag})
createReq := &pushproto.CreatePushRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Command: cmd,
}
if _, err := client.CreatePush(ctx, createReq); err != nil {
@@ -342,7 +342,7 @@ func createPushNoCommand(
) {
t.Helper()
createReq := &pushproto.CreatePushRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
Name: newPushName(t),
Tags: []string{tag},
FcmServiceAccount: fcmServiceAccount,
@@ -365,7 +365,7 @@ func listPushes(t *testing.T, client pushclient.Client) []*pushproto.Push {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := client.ListPushes(ctx, &pushproto.ListPushesRequest{
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
PageSize: int64(500),
})
if err != nil {
diff --git a/test/e2e/tag/tag_test.go b/test/e2e/tag/tag_test.go
index 9b07d2ce2b..f24b9c2919 100644
--- a/test/e2e/tag/tag_test.go
+++ b/test/e2e/tag/tag_test.go
@@ -35,18 +35,18 @@ const (
var (
// FIXME: To avoid compiling the test many times, webGatewayAddr, webGatewayPort & apiKey has been also added here to prevent from getting:
// "flag provided but not defined" error during the test. These 3 are being use in the Gateway test
- webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
- webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
- webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
- apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
- apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
- gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
- gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
- gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
- serviceTokenPath = flag.String("service-token", "", "Service token path")
- environmentNamespace = flag.String("environment-namespace", "", "Environment namespace")
- testID = flag.String("test-id", "", "test ID")
- organizationID = flag.String("organization-id", "", "Organization ID")
+ webGatewayAddr = flag.String("web-gateway-addr", "", "Web gateway endpoint address")
+ webGatewayPort = flag.Int("web-gateway-port", 443, "Web gateway endpoint port")
+ webGatewayCert = flag.String("web-gateway-cert", "", "Web gateway crt file")
+ apiKeyPath = flag.String("api-key", "", "Client SDK API key for api-gateway")
+ apiKeyServerPath = flag.String("api-key-server", "", "Server SDK API key for api-gateway")
+ gatewayAddr = flag.String("gateway-addr", "", "Gateway endpoint address")
+ gatewayPort = flag.Int("gateway-port", 443, "Gateway endpoint port")
+ gatewayCert = flag.String("gateway-cert", "", "Gateway crt file")
+ serviceTokenPath = flag.String("service-token", "", "Service token path")
+ environmentID = flag.String("environment-id", "", "Environment id")
+ testID = flag.String("test-id", "", "test ID")
+ organizationID = flag.String("organization-id", "", "Organization ID")
)
func TestUpsertAndListTag(t *testing.T) {
@@ -91,7 +91,7 @@ func TestDeleteTag(t *testing.T) {
// Create tag
createReq := &tagproto.CreateTagRequest{
Name: newTagName(t),
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
EntityType: tagproto.Tag_FEATURE_FLAG,
}
resp, err := client.CreateTag(ctx, createReq)
@@ -101,7 +101,7 @@ func TestDeleteTag(t *testing.T) {
// Delete tag
req := &tagproto.DeleteTagRequest{
Id: resp.Tag.Id,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
}
defer cancel()
if _, err := client.DeleteTag(ctx, req); err != nil {
@@ -120,7 +120,7 @@ func listTags(ctx context.Context, t *testing.T, client tagclient.Client) []*tag
t.Helper()
resp, err := client.ListTags(ctx, &tagproto.ListTagsRequest{
PageSize: 0,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
})
if err != nil {
t.Fatal("Failed to list tags", err)
@@ -185,7 +185,7 @@ func createTag(
t.Helper()
createReq := &tagproto.CreateTagRequest{
Name: tag,
- EnvironmentId: *environmentNamespace,
+ EnvironmentId: *environmentID,
EntityType: entityType,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
diff --git a/ui/dashboard/src/@api/tag/index.ts b/ui/dashboard/src/@api/tag/index.ts
index 0fa47f3fdc..912fe0fba3 100644
--- a/ui/dashboard/src/@api/tag/index.ts
+++ b/ui/dashboard/src/@api/tag/index.ts
@@ -1,2 +1,2 @@
-export * from './api-tags-fetcher';
+export * from './tags-fetcher';
export * from './tag-creator';
diff --git a/ui/dashboard/src/@api/tag/tag-creator.ts b/ui/dashboard/src/@api/tag/tag-creator.ts
index abdc59562a..12c5495787 100644
--- a/ui/dashboard/src/@api/tag/tag-creator.ts
+++ b/ui/dashboard/src/@api/tag/tag-creator.ts
@@ -1,11 +1,11 @@
import axiosClient from '@api/axios-client';
import { EntityType, Tag } from '@types';
-export type TagCreatorPayload = {
+export interface TagCreatorPayload {
name: string;
environmentId: string;
entityType: EntityType;
-};
+}
export interface TagCreatorResponse {
tag: Tag;
diff --git a/ui/dashboard/src/@api/tag/api-tags-fetcher.ts b/ui/dashboard/src/@api/tag/tags-fetcher.ts
similarity index 96%
rename from ui/dashboard/src/@api/tag/api-tags-fetcher.ts
rename to ui/dashboard/src/@api/tag/tags-fetcher.ts
index 7cf18dce29..444d9bb4c4 100644
--- a/ui/dashboard/src/@api/tag/api-tags-fetcher.ts
+++ b/ui/dashboard/src/@api/tag/tags-fetcher.ts
@@ -6,6 +6,7 @@ import { stringifyParams } from 'utils/search-params';
export interface TagsFetcherParams extends CollectionParams {
environmentId?: string;
+ organizationId?: string;
entityType?: EntityType;
}
diff --git a/ui/dashboard/src/components/creatable-select/index.tsx b/ui/dashboard/src/components/creatable-select/index.tsx
index c9e8109770..1d528917c5 100644
--- a/ui/dashboard/src/components/creatable-select/index.tsx
+++ b/ui/dashboard/src/components/creatable-select/index.tsx
@@ -20,6 +20,7 @@ export interface CreatableSelectProps {
) => void;
value?: MultiValue
+
+
+
+ {[
+ {
+ label: f(messages.goal.experiments),
+ value: Goal.ConnectionType.EXPERIMENT
+ },
+ {
+ label: f(messages.goal.autoOperations),
+ value: Goal.ConnectionType.OPERATION
+ }
+ ].map(({ label, value }) => (
+
+
+
+
+ ))}
+
+
diff --git a/ui/web-v2/src/components/PushAddForm/index.tsx b/ui/web-v2/src/components/PushAddForm/index.tsx
index 853cedf554..4584e9f3b2 100644
--- a/ui/web-v2/src/components/PushAddForm/index.tsx
+++ b/ui/web-v2/src/components/PushAddForm/index.tsx
@@ -12,6 +12,8 @@ import { selectAll as selectAllTags } from '../../modules/tags';
import { Option } from '../CreatableSelect';
import { classNames } from '../../utils/css';
import { Select } from '../Select';
+import { Push } from '../../proto/push/push_pb';
+import { selectAll as selectAllPushes } from '../../modules/pushes';
export interface PushAddFormProps {
onSubmit: () => void;
@@ -30,6 +32,11 @@ export const PushAddForm: FC = memo(
} = methods;
const [selectedFile, setSelectedFile] = useState(null);
+ const pushList = useSelector(
+ (state) => selectAllPushes(state.push),
+ shallowEqual
+ );
+
const tagsList = useSelector(
(state) => selectAllTags(state.tags),
shallowEqual
@@ -38,6 +45,11 @@ export const PushAddForm: FC = memo(
(tag) => tag.entityType === Tag.EntityType.FEATURE_FLAG
);
+ // Filter out tags that are already used in existing pushes
+ const filteredTagsList = featureFlagTagsList.filter(
+ (tag) => !pushList.some((push) => push.tagsList.includes(tag.name))
+ );
+
const onFileInput = (event: ChangeEvent): void => {
const file = event.target.files?.[0];
if (file) {
@@ -103,7 +115,7 @@ export const PushAddForm: FC = memo(
field.onChange(options.map((o) => o.value));
}}
disabled={isSubmitted}
- options={featureFlagTagsList.map((tag) => ({
+ options={filteredTagsList.map((tag) => ({
label: tag.name,
value: tag.name
}))}
diff --git a/ui/web-v2/src/components/PushUpdateForm/index.tsx b/ui/web-v2/src/components/PushUpdateForm/index.tsx
index 2c950d4445..30f23542f1 100644
--- a/ui/web-v2/src/components/PushUpdateForm/index.tsx
+++ b/ui/web-v2/src/components/PushUpdateForm/index.tsx
@@ -11,6 +11,8 @@ import { useIsEditable } from '../../modules/me';
import { selectAll as selectAllTags } from '../../modules/tags';
import { Option } from '../CreatableSelect';
import { Select } from '../Select';
+import { Push } from '../../proto/push/push_pb';
+import { selectAll as selectAllPushes } from '../../modules/pushes';
export interface PushUpdateFormProps {
onSubmit: () => void;
@@ -28,6 +30,10 @@ export const PushUpdateForm: FC = memo(
formState: { errors, isValid, isDirty, isSubmitted }
} = methods;
+ const pushList = useSelector(
+ (state) => selectAllPushes(state.push),
+ shallowEqual
+ );
const tagsList = useSelector(
(state) => selectAllTags(state.tags),
shallowEqual
@@ -35,6 +41,10 @@ export const PushUpdateForm: FC = memo(
const featureFlagTagsList = tagsList.filter(
(tag) => tag.entityType === Tag.EntityType.FEATURE_FLAG
);
+ // Filter out tags that are already used in existing pushes
+ const filteredTagsList = featureFlagTagsList.filter(
+ (tag) => !pushList.some((push) => push.tagsList.includes(tag.name))
+ );
return (
@@ -97,7 +107,7 @@ export const PushUpdateForm: FC
= memo(
label: tag
};
})}
- options={featureFlagTagsList.map((tag) => ({
+ options={filteredTagsList.map((tag) => ({
label: tag.name,
value: tag.name
}))}
diff --git a/ui/web-v2/src/lang/messages.ts b/ui/web-v2/src/lang/messages.ts
index 4de0bfe492..7d4f46d7ae 100644
--- a/ui/web-v2/src/lang/messages.ts
+++ b/ui/web-v2/src/lang/messages.ts
@@ -1369,6 +1369,18 @@ export const messages = {
createGoal: defineMessage({
id: 'goal.createGoal',
defaultMessage: 'Create Goal'
+ }),
+ connection: defineMessage({
+ id: 'goal.connection',
+ defaultMessage: 'Connection'
+ }),
+ experiments: defineMessage({
+ id: 'goal.experiments',
+ defaultMessage: 'Experiments'
+ }),
+ autoOperations: defineMessage({
+ id: 'goal.autoOperations',
+ defaultMessage: 'Auto Operations'
})
},
experiment: {
diff --git a/ui/web-v2/src/modules/goals.ts b/ui/web-v2/src/modules/goals.ts
index 0540c87590..b7e0549c77 100644
--- a/ui/web-v2/src/modules/goals.ts
+++ b/ui/web-v2/src/modules/goals.ts
@@ -98,6 +98,7 @@ interface CreateGoalParams {
id: string;
name: string;
description: string;
+ connectionType: Goal.ConnectionTypeMap[keyof Goal.ConnectionTypeMap];
}
export const createGoal = createAsyncThunk<
@@ -111,6 +112,7 @@ export const createGoal = createAsyncThunk<
command.setId(params.id);
command.setName(params.name);
command.setDescription(params.description);
+ params.connectionType && command.setConnectionType(params.connectionType);
request.setCommand(command);
await grpc.createGoal(request);
});
diff --git a/ui/web-v2/src/modules/tags.ts b/ui/web-v2/src/modules/tags.ts
index e775fe6a39..825d47babd 100644
--- a/ui/web-v2/src/modules/tags.ts
+++ b/ui/web-v2/src/modules/tags.ts
@@ -26,6 +26,7 @@ export type OrderBy =
ListTagsRequest.OrderByMap[keyof ListTagsRequest.OrderByMap];
export type OrderDirection =
ListTagsRequest.OrderDirectionMap[keyof ListTagsRequest.OrderDirectionMap];
+export type TagEntityType = Tag.EntityTypeMap[keyof Tag.EntityTypeMap];
export interface ListTagsParams {
environmentId: string;
@@ -34,6 +35,7 @@ export interface ListTagsParams {
orderBy: OrderBy;
orderDirection: OrderDirection;
searchKeyword: string;
+ entityType: TagEntityType;
}
export const listTags = createAsyncThunk<
@@ -48,6 +50,7 @@ export const listTags = createAsyncThunk<
request.setOrderBy(params.orderBy);
request.setOrderDirection(params.orderDirection);
request.setSearchKeyword(params.searchKeyword);
+ request.setEntityType(params.entityType);
const result = await tagsGrpc.listTags(request);
return result.response.toObject();
diff --git a/ui/web-v2/src/pages/account/index.tsx b/ui/web-v2/src/pages/account/index.tsx
index f1b3875d6a..ecd13ee17d 100644
--- a/ui/web-v2/src/pages/account/index.tsx
+++ b/ui/web-v2/src/pages/account/index.tsx
@@ -57,6 +57,7 @@ import {
import { addFormSchema, updateFormSchema } from './formSchema';
import { listTags } from '../../modules/tags';
import { ListTagsRequest } from '../../proto/tag/service_pb';
+import { Tag } from '../../proto/tag/tag_pb';
interface Sort {
orderBy: OrderBy;
@@ -444,11 +445,12 @@ export const AccountIndexPage: FC = memo(() => {
dispatch(
listTags({
environmentId: currentEnvironment.id,
- pageSize: 99999,
+ pageSize: 0,
cursor: '',
orderBy: ListTagsRequest.OrderBy.DEFAULT,
orderDirection: ListTagsRequest.OrderDirection.ASC,
- searchKeyword: null
+ searchKeyword: null,
+ entityType: Tag.EntityType.ACCOUNT
})
);
}, [dispatch]);
diff --git a/ui/web-v2/src/pages/debugger/index.tsx b/ui/web-v2/src/pages/debugger/index.tsx
index b853561967..fed84d3e78 100644
--- a/ui/web-v2/src/pages/debugger/index.tsx
+++ b/ui/web-v2/src/pages/debugger/index.tsx
@@ -85,9 +85,6 @@ export const DebuggerIndexPage: FC = memo(() => {
);
Promise.all(featureDetailsPromises).then((detailedEvaluations) => {
- console.log({
- allEvaluations: detailedEvaluations // Now includes feature details
- });
setUserEvaluations(detailedEvaluations);
setShowResults(true);
});
diff --git a/ui/web-v2/src/pages/experiment/index.tsx b/ui/web-v2/src/pages/experiment/index.tsx
index c24d3aeadd..616b6cd06e 100644
--- a/ui/web-v2/src/pages/experiment/index.tsx
+++ b/ui/web-v2/src/pages/experiment/index.tsx
@@ -128,7 +128,7 @@ export const ExperimentIndexPage: FC = memo(() => {
featureId: null,
featureVersion: null,
baselineVariation: null,
- goalIds: null,
+ goalIds: [],
startAt: null,
stopAt: null
};
diff --git a/ui/web-v2/src/pages/feature/formSchema.ts b/ui/web-v2/src/pages/feature/formSchema.ts
index 7f3f830b22..8f002825b3 100644
--- a/ui/web-v2/src/pages/feature/formSchema.ts
+++ b/ui/web-v2/src/pages/feature/formSchema.ts
@@ -277,6 +277,7 @@ export const operationFormSchema = yup.object().shape({
export type OperationForm = yup.InferType;
const tagsSchema = yup.array().min(FEATURE_TAG_MIN_SIZE).of(yup.string());
+const settingsTagsSchema = yup.array().of(yup.string());
export const switchEnabledFormSchema = (requireComment: boolean) => {
return yup.object().shape({
@@ -339,7 +340,7 @@ export const settingsFormSchema = (requireComment: boolean) =>
yup.object().shape({
name: nameSchema,
description: descriptionSchema,
- tags: tagsSchema,
+ tags: settingsTagsSchema,
comment: requireComment ? commentSchema : yup.string()
});
diff --git a/ui/web-v2/src/pages/feature/index.tsx b/ui/web-v2/src/pages/feature/index.tsx
index f9721fde85..c7016d337c 100644
--- a/ui/web-v2/src/pages/feature/index.tsx
+++ b/ui/web-v2/src/pages/feature/index.tsx
@@ -47,6 +47,7 @@ import {
ListFeaturesRequest,
ListTagsRequest
} from '../../proto/feature/service_pb';
+import { Tag } from '../../proto/tag/tag_pb';
import { AppDispatch } from '../../store';
import { isFeatureSortOption, FeatureSortOption } from '../../types/feature';
import {
@@ -525,11 +526,12 @@ export const FeatureIndexPage: FC = memo(() => {
dispatch(
listTags({
environmentId: currentEnvironment.id,
- pageSize: 99999,
+ pageSize: 0,
cursor: '',
orderBy: ListTagsRequest.OrderBy.DEFAULT,
orderDirection: ListTagsRequest.OrderDirection.ASC,
- searchKeyword: null
+ searchKeyword: null,
+ entityType: Tag.EntityType.FEATURE_FLAG
})
);
}, [dispatch, updateFeatureList]);
diff --git a/ui/web-v2/src/pages/feature/settings.tsx b/ui/web-v2/src/pages/feature/settings.tsx
index 1112138218..a3fe5b976f 100644
--- a/ui/web-v2/src/pages/feature/settings.tsx
+++ b/ui/web-v2/src/pages/feature/settings.tsx
@@ -1,6 +1,6 @@
import { yupResolver } from '@hookform/resolvers/yup';
import { SerializedError } from '@reduxjs/toolkit';
-import React, { FC, memo, useCallback, useState } from 'react';
+import React, { FC, memo, useCallback, useEffect, useState } from 'react';
import { useForm, FormProvider } from 'react-hook-form';
import { useIntl } from 'react-intl';
import { useDispatch, useSelector } from 'react-redux';
@@ -27,6 +27,9 @@ import { Feature } from '../../proto/feature/feature_pb';
import { AppDispatch } from '../../store';
import { settingsFormSchema } from './formSchema';
+import { listTags } from '../../modules/tags';
+import { ListTagsRequest } from '../../proto/tag/service_pb';
+import { Tag } from '../../proto/tag/tag_pb';
interface FeatureSettingsPageProps {
featureId: string;
@@ -61,10 +64,25 @@ export const FeatureSettingsPage: FC = memo(
});
const {
handleSubmit,
- formState: { dirtyFields }
+ formState: { dirtyFields },
+ reset
} = methods;
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
+ useEffect(() => {
+ dispatch(
+ listTags({
+ environmentId: currentEnvironment.id,
+ pageSize: 0,
+ cursor: '',
+ orderBy: ListTagsRequest.OrderBy.DEFAULT,
+ orderDirection: ListTagsRequest.OrderDirection.ASC,
+ searchKeyword: null,
+ entityType: Tag.EntityType.FEATURE_FLAG
+ })
+ );
+ }, [dispatch]);
+
const handleUpdate = useCallback(
async (data) => {
const commands: UpdateDetailCommands = {};
@@ -112,7 +130,15 @@ export const FeatureSettingsPage: FC = memo(
environmentId: currentEnvironment.id,
id: featureId
})
- );
+ ).then((res) => {
+ const featurePayload = res.payload as Feature.AsObject;
+ reset({
+ name: featurePayload.name,
+ description: featurePayload.description,
+ tags: featurePayload.tagsList,
+ comment: ''
+ });
+ });
});
},
[dispatch, dirtyFields]
diff --git a/ui/web-v2/src/pages/feature/targeting.tsx b/ui/web-v2/src/pages/feature/targeting.tsx
index 048d782a1a..1ad70e8c0c 100644
--- a/ui/web-v2/src/pages/feature/targeting.tsx
+++ b/ui/web-v2/src/pages/feature/targeting.tsx
@@ -85,9 +85,6 @@ export const FeatureTargetingPage: FC = memo(
return JSON.stringify(left) === JSON.stringify(right);
}
);
- const [isResetTargeting, setIsResetTargeting] = useState(false);
-
- console.log({ feature });
const getDefaultValues = (
feature: Feature.AsObject,
@@ -216,8 +213,14 @@ export const FeatureTargetingPage: FC = memo(
environmentId: currentEnvironment.id,
id: featureId
})
- ).then(() => {
- setIsResetTargeting(true);
+ ).then((response) => {
+ const featurePayload = response.payload as Feature.AsObject;
+ reset(
+ getDefaultValues(
+ featurePayload,
+ currentEnvironment.requireComment
+ )
+ );
});
});
},
@@ -233,13 +236,6 @@ export const FeatureTargetingPage: FC = memo(
);
}, [dispatch, currentEnvironment]);
- useEffect(() => {
- if (isResetTargeting) {
- reset(getDefaultValues(feature, currentEnvironment.requireComment));
- setIsResetTargeting(false);
- }
- }, [feature, isResetTargeting]);
-
useEffect(() => {
if (feature) {
reset(getDefaultValues(feature, currentEnvironment.requireComment));
diff --git a/ui/web-v2/src/pages/feature/variations.tsx b/ui/web-v2/src/pages/feature/variations.tsx
index 2a9e0b6897..7cd9b80e77 100644
--- a/ui/web-v2/src/pages/feature/variations.tsx
+++ b/ui/web-v2/src/pages/feature/variations.tsx
@@ -69,7 +69,8 @@ export const FeatureVariationsPage: FC = memo(
});
const {
handleSubmit,
- formState: { dirtyFields }
+ formState: { dirtyFields },
+ reset
} = methods;
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
@@ -95,7 +96,15 @@ export const FeatureVariationsPage: FC = memo(
environmentId: currentEnvironment.id,
id: featureId
})
- );
+ ).then((response) => {
+ const featurePayload = response.payload as Feature.AsObject;
+ reset({
+ variationType: featurePayload.variationType.toString(),
+ variations: featurePayload.variationsList,
+ requireComment: currentEnvironment.requireComment,
+ comment: ''
+ });
+ });
});
},
[feature, dispatch, dirtyFields]
diff --git a/ui/web-v2/src/pages/goal/formSchema.ts b/ui/web-v2/src/pages/goal/formSchema.ts
index 6758b5c3c8..ecc38bc6a0 100644
--- a/ui/web-v2/src/pages/goal/formSchema.ts
+++ b/ui/web-v2/src/pages/goal/formSchema.ts
@@ -12,11 +12,13 @@ yup.setLocale(yupLocale);
const idSchema = yup.string().required().max(GOAL_ID_MAX_LENGTH);
const nameSchema = yup.string().required().max(GOAL_NAME_MAX_LENGTH);
const descriptionSchema = yup.string().max(GOAL_DESCRIPTION_MAX_LENGTH);
+const connectionTypeSchema = yup.string().required();
export const addFormSchema = yup.object().shape({
id: idSchema,
name: nameSchema,
- description: descriptionSchema
+ description: descriptionSchema,
+ connectionType: connectionTypeSchema
});
export const updateFormSchema = yup.object().shape({
diff --git a/ui/web-v2/src/pages/goal/index.tsx b/ui/web-v2/src/pages/goal/index.tsx
index c2af8f159a..741aad815b 100644
--- a/ui/web-v2/src/pages/goal/index.tsx
+++ b/ui/web-v2/src/pages/goal/index.tsx
@@ -102,12 +102,14 @@ export const GoalIndexPage: FC = memo(() => {
(state) => [selectGoalById(state.goals, goalId), state.goals.getGoalError],
shallowEqual
);
+
const addMethod = useForm({
resolver: yupResolver(addFormSchema),
defaultValues: {
id: '',
name: '',
- description: ''
+ description: '',
+ connectionType: null
},
mode: 'onChange'
});
@@ -120,7 +122,8 @@ export const GoalIndexPage: FC = memo(() => {
environmentId: currentEnvironment.id,
id: data.id,
name: data.name,
- description: data.description
+ description: data.description,
+ connectionType: data.connectionType
})
).then(() => {
setOpen(false);
@@ -244,7 +247,8 @@ export const GoalIndexPage: FC = memo(() => {
resetUpdate({
id: g.id,
name: g.name,
- description: g.description
+ description: g.description,
+ connectionType: g.connectionType
});
history.push({
pathname: `${PAGE_PATH_ROOT}${currentEnvironment.urlCode}${PAGE_PATH_GOALS}/${g.id}`,
@@ -313,7 +317,8 @@ export const GoalIndexPage: FC = memo(() => {
resetUpdate({
id: goal.id,
name: goal.name,
- description: goal.description
+ description: goal.description,
+ connectionType: goal.connectionType
});
});
}
diff --git a/ui/web-v2/src/pages/push/index.tsx b/ui/web-v2/src/pages/push/index.tsx
index 2c5d20486f..594c00fe74 100644
--- a/ui/web-v2/src/pages/push/index.tsx
+++ b/ui/web-v2/src/pages/push/index.tsx
@@ -1,5 +1,6 @@
import { listTags } from '../../modules/tags';
import { ListTagsRequest } from '../../proto/feature/service_pb';
+import { Tag } from '../../proto/tag/tag_pb';
import { yupResolver } from '@hookform/resolvers/yup';
import React, { FC, memo, useCallback, useEffect, useState } from 'react';
import { useForm, FormProvider } from 'react-hook-form';
@@ -322,11 +323,12 @@ export const PushIndexPage: FC = memo(() => {
dispatch(
listTags({
environmentId: currentEnvironment.id,
- pageSize: 99999,
+ pageSize: 0,
cursor: '',
orderBy: ListTagsRequest.OrderBy.DEFAULT,
orderDirection: ListTagsRequest.OrderDirection.ASC,
- searchKeyword: null
+ searchKeyword: null,
+ entityType: Tag.EntityType.FEATURE_FLAG
})
);
}, []);
diff --git a/ui/web-v2/src/proto/batch/service_pb.d.ts b/ui/web-v2/src/proto/batch/service_pb.d.ts
index de4efd0765..3d595e880f 100644
--- a/ui/web-v2/src/proto/batch/service_pb.d.ts
+++ b/ui/web-v2/src/proto/batch/service_pb.d.ts
@@ -79,6 +79,7 @@ export interface BatchJobMap {
APIKEYCACHER: 15;
AUTOOPSRULESCACHER: 16;
EXPERIMENTCACHER: 17;
+ TAGDELETER: 18;
}
export const BatchJob: BatchJobMap;
diff --git a/ui/web-v2/src/proto/batch/service_pb.js b/ui/web-v2/src/proto/batch/service_pb.js
index 6275a505a6..d148b016f7 100644
--- a/ui/web-v2/src/proto/batch/service_pb.js
+++ b/ui/web-v2/src/proto/batch/service_pb.js
@@ -338,7 +338,8 @@ proto.bucketeer.batch.BatchJob = {
SEGMENTUSERCACHER: 14,
APIKEYCACHER: 15,
AUTOOPSRULESCACHER: 16,
- EXPERIMENTCACHER: 17
+ EXPERIMENTCACHER: 17,
+ TAGDELETER: 18
};
goog.object.extend(exports, proto.bucketeer.batch);
diff --git a/ui/web-v2/src/proto/coderef/code_reference_pb.d.ts b/ui/web-v2/src/proto/coderef/code_reference_pb.d.ts
new file mode 100644
index 0000000000..8b07edb9ec
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/code_reference_pb.d.ts
@@ -0,0 +1,109 @@
+// package: bucketeer.coderef
+// file: proto/coderef/code_reference.proto
+
+import * as jspb from 'google-protobuf';
+
+export class CodeReference extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getFeatureId(): string;
+ setFeatureId(value: string): void;
+
+ getFilePath(): string;
+ setFilePath(value: string): void;
+
+ getLineNumber(): number;
+ setLineNumber(value: number): void;
+
+ getCodeSnippet(): string;
+ setCodeSnippet(value: string): void;
+
+ getContentHash(): string;
+ setContentHash(value: string): void;
+
+ clearAliasesList(): void;
+ getAliasesList(): Array;
+ setAliasesList(value: Array): void;
+ addAliases(value: string, index?: number): string;
+
+ getRepositoryName(): string;
+ setRepositoryName(value: string): void;
+
+ getRepositoryOwner(): string;
+ setRepositoryOwner(value: string): void;
+
+ getRepositoryType(): CodeReference.RepositoryTypeMap[keyof CodeReference.RepositoryTypeMap];
+ setRepositoryType(
+ value: CodeReference.RepositoryTypeMap[keyof CodeReference.RepositoryTypeMap]
+ ): void;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCommitHash(): string;
+ setCommitHash(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getCreatedAt(): number;
+ setCreatedAt(value: number): void;
+
+ getUpdatedAt(): number;
+ setUpdatedAt(value: number): void;
+
+ getSourceUrl(): string;
+ setSourceUrl(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CodeReference.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CodeReference
+ ): CodeReference.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CodeReference,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CodeReference;
+ static deserializeBinaryFromReader(
+ message: CodeReference,
+ reader: jspb.BinaryReader
+ ): CodeReference;
+}
+
+export namespace CodeReference {
+ export type AsObject = {
+ id: string;
+ featureId: string;
+ filePath: string;
+ lineNumber: number;
+ codeSnippet: string;
+ contentHash: string;
+ aliasesList: Array;
+ repositoryName: string;
+ repositoryOwner: string;
+ repositoryType: CodeReference.RepositoryTypeMap[keyof CodeReference.RepositoryTypeMap];
+ repositoryBranch: string;
+ commitHash: string;
+ environmentId: string;
+ createdAt: number;
+ updatedAt: number;
+ sourceUrl: string;
+ };
+
+ export interface RepositoryTypeMap {
+ REPOSITORY_TYPE_UNSPECIFIED: 0;
+ GITHUB: 1;
+ GITLAB: 2;
+ BITBUCKET: 3;
+ CUSTOM: 4;
+ }
+
+ export const RepositoryType: RepositoryTypeMap;
+}
diff --git a/ui/web-v2/src/proto/coderef/code_reference_pb.js b/ui/web-v2/src/proto/coderef/code_reference_pb.js
new file mode 100644
index 0000000000..2e5fe5e061
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/code_reference_pb.js
@@ -0,0 +1,653 @@
+// source: proto/coderef/code_reference.proto
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {missingRequire} reports error on implicit type usages.
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+/* eslint-disable */
+// @ts-nocheck
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global =
+ (typeof globalThis !== 'undefined' && globalThis) ||
+ (typeof window !== 'undefined' && window) ||
+ (typeof global !== 'undefined' && global) ||
+ (typeof self !== 'undefined' && self) ||
+ function () {
+ return this;
+ }.call(null) ||
+ Function('return this')();
+
+goog.exportSymbol('proto.bucketeer.coderef.CodeReference', null, global);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.CodeReference.RepositoryType',
+ null,
+ global
+);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.CodeReference = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.coderef.CodeReference.repeatedFields_,
+ null
+ );
+};
+goog.inherits(proto.bucketeer.coderef.CodeReference, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.CodeReference.displayName =
+ 'proto.bucketeer.coderef.CodeReference';
+}
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.coderef.CodeReference.repeatedFields_ = [7];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.CodeReference.prototype.toObject = function (
+ opt_includeInstance
+ ) {
+ return proto.bucketeer.coderef.CodeReference.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.CodeReference} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.CodeReference.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ featureId: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ filePath: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ lineNumber: jspb.Message.getFieldWithDefault(msg, 4, 0),
+ codeSnippet: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ contentHash: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ aliasesList:
+ (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f,
+ repositoryName: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ repositoryOwner: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ repositoryType: jspb.Message.getFieldWithDefault(msg, 10, 0),
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 11, ''),
+ commitHash: jspb.Message.getFieldWithDefault(msg, 12, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 13, ''),
+ createdAt: jspb.Message.getFieldWithDefault(msg, 14, 0),
+ updatedAt: jspb.Message.getFieldWithDefault(msg, 15, 0),
+ sourceUrl: jspb.Message.getFieldWithDefault(msg, 16, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.CodeReference.deserializeBinary = function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.CodeReference();
+ return proto.bucketeer.coderef.CodeReference.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.CodeReference} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.CodeReference.deserializeBinaryFromReader = function (
+ msg,
+ reader
+) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFeatureId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFilePath(value);
+ break;
+ case 4:
+ var value = /** @type {number} */ (reader.readInt32());
+ msg.setLineNumber(value);
+ break;
+ case 5:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCodeSnippet(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setContentHash(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addAliases(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryName(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryOwner(value);
+ break;
+ case 10:
+ var value =
+ /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ reader.readEnum()
+ );
+ msg.setRepositoryType(value);
+ break;
+ case 11:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 12:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitHash(value);
+ break;
+ case 13:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 14:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setCreatedAt(value);
+ break;
+ case 15:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setUpdatedAt(value);
+ break;
+ case 16:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setSourceUrl(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.serializeBinary = function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.CodeReference.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.CodeReference} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.CodeReference.serializeBinaryToWriter = function (
+ message,
+ writer
+) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getFeatureId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getFilePath();
+ if (f.length > 0) {
+ writer.writeString(3, f);
+ }
+ f = message.getLineNumber();
+ if (f !== 0) {
+ writer.writeInt32(4, f);
+ }
+ f = message.getCodeSnippet();
+ if (f.length > 0) {
+ writer.writeString(5, f);
+ }
+ f = message.getContentHash();
+ if (f.length > 0) {
+ writer.writeString(6, f);
+ }
+ f = message.getAliasesList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(7, f);
+ }
+ f = message.getRepositoryName();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getRepositoryOwner();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getRepositoryType();
+ if (f !== 0.0) {
+ writer.writeEnum(10, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(11, f);
+ }
+ f = message.getCommitHash();
+ if (f.length > 0) {
+ writer.writeString(12, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(13, f);
+ }
+ f = message.getCreatedAt();
+ if (f !== 0) {
+ writer.writeInt64(14, f);
+ }
+ f = message.getUpdatedAt();
+ if (f !== 0) {
+ writer.writeInt64(15, f);
+ }
+ f = message.getSourceUrl();
+ if (f.length > 0) {
+ writer.writeString(16, f);
+ }
+};
+
+/**
+ * @enum {number}
+ */
+proto.bucketeer.coderef.CodeReference.RepositoryType = {
+ REPOSITORY_TYPE_UNSPECIFIED: 0,
+ GITHUB: 1,
+ GITLAB: 2,
+ BITBUCKET: 3,
+ CUSTOM: 4
+};
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setId = function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * optional string feature_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getFeatureId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setFeatureId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+/**
+ * optional string file_path = 3;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getFilePath = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setFilePath = function (value) {
+ return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+/**
+ * optional int32 line_number = 4;
+ * @return {number}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getLineNumber = function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setLineNumber = function (
+ value
+) {
+ return jspb.Message.setProto3IntField(this, 4, value);
+};
+
+/**
+ * optional string code_snippet = 5;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getCodeSnippet = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setCodeSnippet = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 5, value);
+};
+
+/**
+ * optional string content_hash = 6;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getContentHash = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setContentHash = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 6, value);
+};
+
+/**
+ * repeated string aliases = 7;
+ * @return {!Array}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getAliasesList = function () {
+ return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 7));
+};
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setAliasesList = function (
+ value
+) {
+ return jspb.Message.setField(this, 7, value || []);
+};
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.addAliases = function (
+ value,
+ opt_index
+) {
+ return jspb.Message.addToRepeatedField(this, 7, value, opt_index);
+};
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.clearAliasesList = function () {
+ return this.setAliasesList([]);
+};
+
+/**
+ * optional string repository_name = 8;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getRepositoryName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setRepositoryName = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+};
+
+/**
+ * optional string repository_owner = 9;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getRepositoryOwner =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setRepositoryOwner = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+};
+
+/**
+ * optional RepositoryType repository_type = 10;
+ * @return {!proto.bucketeer.coderef.CodeReference.RepositoryType}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getRepositoryType =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference.RepositoryType} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setRepositoryType = function (
+ value
+) {
+ return jspb.Message.setProto3EnumField(this, 10, value);
+};
+
+/**
+ * optional string repository_branch = 11;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 11, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setRepositoryBranch = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 11, value);
+};
+
+/**
+ * optional string commit_hash = 12;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getCommitHash = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 12, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setCommitHash = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 12, value);
+};
+
+/**
+ * optional string environment_id = 13;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getEnvironmentId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 13, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setEnvironmentId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 13, value);
+};
+
+/**
+ * optional int64 created_at = 14;
+ * @return {number}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getCreatedAt = function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 14, 0));
+};
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setCreatedAt = function (
+ value
+) {
+ return jspb.Message.setProto3IntField(this, 14, value);
+};
+
+/**
+ * optional int64 updated_at = 15;
+ * @return {number}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getUpdatedAt = function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 15, 0));
+};
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setUpdatedAt = function (
+ value
+) {
+ return jspb.Message.setProto3IntField(this, 15, value);
+};
+
+/**
+ * optional string source_url = 16;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CodeReference.prototype.getSourceUrl = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 16, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CodeReference} returns this
+ */
+proto.bucketeer.coderef.CodeReference.prototype.setSourceUrl = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 16, value);
+};
+
+goog.object.extend(exports, proto.bucketeer.coderef);
diff --git a/ui/web-v2/src/proto/coderef/code_reference_pb_service.d.ts b/ui/web-v2/src/proto/coderef/code_reference_pb_service.d.ts
new file mode 100644
index 0000000000..94d81da4de
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/code_reference_pb_service.d.ts
@@ -0,0 +1,2 @@
+// package: bucketeer.coderef
+// file: proto/coderef/code_reference.proto
diff --git a/ui/web-v2/src/proto/coderef/code_reference_pb_service.js b/ui/web-v2/src/proto/coderef/code_reference_pb_service.js
new file mode 100644
index 0000000000..94d81da4de
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/code_reference_pb_service.js
@@ -0,0 +1,2 @@
+// package: bucketeer.coderef
+// file: proto/coderef/code_reference.proto
diff --git a/ui/web-v2/src/proto/coderef/service_pb.d.ts b/ui/web-v2/src/proto/coderef/service_pb.d.ts
new file mode 100644
index 0000000000..2a9fa02544
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/service_pb.d.ts
@@ -0,0 +1,498 @@
+// package: bucketeer.coderef
+// file: proto/coderef/service.proto
+
+import * as jspb from 'google-protobuf';
+import * as proto_coderef_code_reference_pb from '../../proto/coderef/code_reference_pb';
+import * as google_api_annotations_pb from '../../google/api/annotations_pb';
+import * as protoc_gen_openapiv2_options_annotations_pb from '../../protoc-gen-openapiv2/options/annotations_pb';
+
+export class GetCodeReferenceRequest extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetCodeReferenceRequest.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: GetCodeReferenceRequest
+ ): GetCodeReferenceRequest.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: GetCodeReferenceRequest,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): GetCodeReferenceRequest;
+ static deserializeBinaryFromReader(
+ message: GetCodeReferenceRequest,
+ reader: jspb.BinaryReader
+ ): GetCodeReferenceRequest;
+}
+
+export namespace GetCodeReferenceRequest {
+ export type AsObject = {
+ id: string;
+ environmentId: string;
+ };
+}
+
+export class GetCodeReferenceResponse extends jspb.Message {
+ hasCodeReference(): boolean;
+ clearCodeReference(): void;
+ getCodeReference(): proto_coderef_code_reference_pb.CodeReference | undefined;
+ setCodeReference(value?: proto_coderef_code_reference_pb.CodeReference): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetCodeReferenceResponse.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: GetCodeReferenceResponse
+ ): GetCodeReferenceResponse.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: GetCodeReferenceResponse,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): GetCodeReferenceResponse;
+ static deserializeBinaryFromReader(
+ message: GetCodeReferenceResponse,
+ reader: jspb.BinaryReader
+ ): GetCodeReferenceResponse;
+}
+
+export namespace GetCodeReferenceResponse {
+ export type AsObject = {
+ codeReference?: proto_coderef_code_reference_pb.CodeReference.AsObject;
+ };
+}
+
+export class ListCodeReferencesRequest extends jspb.Message {
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getFeatureId(): string;
+ setFeatureId(value: string): void;
+
+ getRepositoryName(): string;
+ setRepositoryName(value: string): void;
+
+ getRepositoryOwner(): string;
+ setRepositoryOwner(value: string): void;
+
+ getRepositoryType(): proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ setRepositoryType(
+ value: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap]
+ ): void;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCursor(): string;
+ setCursor(value: string): void;
+
+ getPageSize(): number;
+ setPageSize(value: number): void;
+
+ getOrderBy(): ListCodeReferencesRequest.OrderByMap[keyof ListCodeReferencesRequest.OrderByMap];
+ setOrderBy(
+ value: ListCodeReferencesRequest.OrderByMap[keyof ListCodeReferencesRequest.OrderByMap]
+ ): void;
+
+ getOrderDirection(): ListCodeReferencesRequest.OrderDirectionMap[keyof ListCodeReferencesRequest.OrderDirectionMap];
+ setOrderDirection(
+ value: ListCodeReferencesRequest.OrderDirectionMap[keyof ListCodeReferencesRequest.OrderDirectionMap]
+ ): void;
+
+ getFileExtension(): string;
+ setFileExtension(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListCodeReferencesRequest.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: ListCodeReferencesRequest
+ ): ListCodeReferencesRequest.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: ListCodeReferencesRequest,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): ListCodeReferencesRequest;
+ static deserializeBinaryFromReader(
+ message: ListCodeReferencesRequest,
+ reader: jspb.BinaryReader
+ ): ListCodeReferencesRequest;
+}
+
+export namespace ListCodeReferencesRequest {
+ export type AsObject = {
+ environmentId: string;
+ featureId: string;
+ repositoryName: string;
+ repositoryOwner: string;
+ repositoryType: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ repositoryBranch: string;
+ cursor: string;
+ pageSize: number;
+ orderBy: ListCodeReferencesRequest.OrderByMap[keyof ListCodeReferencesRequest.OrderByMap];
+ orderDirection: ListCodeReferencesRequest.OrderDirectionMap[keyof ListCodeReferencesRequest.OrderDirectionMap];
+ fileExtension: string;
+ };
+
+ export interface OrderByMap {
+ DEFAULT: 0;
+ CREATED_AT: 1;
+ UPDATED_AT: 2;
+ }
+
+ export const OrderBy: OrderByMap;
+
+ export interface OrderDirectionMap {
+ ASC: 0;
+ DESC: 1;
+ }
+
+ export const OrderDirection: OrderDirectionMap;
+}
+
+export class ListCodeReferencesResponse extends jspb.Message {
+ clearCodeReferencesList(): void;
+ getCodeReferencesList(): Array;
+ setCodeReferencesList(
+ value: Array
+ ): void;
+ addCodeReferences(
+ value?: proto_coderef_code_reference_pb.CodeReference,
+ index?: number
+ ): proto_coderef_code_reference_pb.CodeReference;
+
+ getCursor(): string;
+ setCursor(value: string): void;
+
+ getTotalCount(): number;
+ setTotalCount(value: number): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListCodeReferencesResponse.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: ListCodeReferencesResponse
+ ): ListCodeReferencesResponse.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: ListCodeReferencesResponse,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): ListCodeReferencesResponse;
+ static deserializeBinaryFromReader(
+ message: ListCodeReferencesResponse,
+ reader: jspb.BinaryReader
+ ): ListCodeReferencesResponse;
+}
+
+export namespace ListCodeReferencesResponse {
+ export type AsObject = {
+ codeReferencesList: Array;
+ cursor: string;
+ totalCount: number;
+ };
+}
+
+export class CreateCodeReferenceRequest extends jspb.Message {
+ getFeatureId(): string;
+ setFeatureId(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getFilePath(): string;
+ setFilePath(value: string): void;
+
+ getLineNumber(): number;
+ setLineNumber(value: number): void;
+
+ getCodeSnippet(): string;
+ setCodeSnippet(value: string): void;
+
+ getContentHash(): string;
+ setContentHash(value: string): void;
+
+ clearAliasesList(): void;
+ getAliasesList(): Array;
+ setAliasesList(value: Array): void;
+ addAliases(value: string, index?: number): string;
+
+ getRepositoryName(): string;
+ setRepositoryName(value: string): void;
+
+ getRepositoryOwner(): string;
+ setRepositoryOwner(value: string): void;
+
+ getRepositoryType(): proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ setRepositoryType(
+ value: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap]
+ ): void;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCommitHash(): string;
+ setCommitHash(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CreateCodeReferenceRequest.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CreateCodeReferenceRequest
+ ): CreateCodeReferenceRequest.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CreateCodeReferenceRequest,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CreateCodeReferenceRequest;
+ static deserializeBinaryFromReader(
+ message: CreateCodeReferenceRequest,
+ reader: jspb.BinaryReader
+ ): CreateCodeReferenceRequest;
+}
+
+export namespace CreateCodeReferenceRequest {
+ export type AsObject = {
+ featureId: string;
+ environmentId: string;
+ filePath: string;
+ lineNumber: number;
+ codeSnippet: string;
+ contentHash: string;
+ aliasesList: Array;
+ repositoryName: string;
+ repositoryOwner: string;
+ repositoryType: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ repositoryBranch: string;
+ commitHash: string;
+ };
+}
+
+export class CreateCodeReferenceResponse extends jspb.Message {
+ hasCodeReference(): boolean;
+ clearCodeReference(): void;
+ getCodeReference(): proto_coderef_code_reference_pb.CodeReference | undefined;
+ setCodeReference(value?: proto_coderef_code_reference_pb.CodeReference): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CreateCodeReferenceResponse.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CreateCodeReferenceResponse
+ ): CreateCodeReferenceResponse.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CreateCodeReferenceResponse,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CreateCodeReferenceResponse;
+ static deserializeBinaryFromReader(
+ message: CreateCodeReferenceResponse,
+ reader: jspb.BinaryReader
+ ): CreateCodeReferenceResponse;
+}
+
+export namespace CreateCodeReferenceResponse {
+ export type AsObject = {
+ codeReference?: proto_coderef_code_reference_pb.CodeReference.AsObject;
+ };
+}
+
+export class UpdateCodeReferenceRequest extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getFilePath(): string;
+ setFilePath(value: string): void;
+
+ getLineNumber(): number;
+ setLineNumber(value: number): void;
+
+ getCodeSnippet(): string;
+ setCodeSnippet(value: string): void;
+
+ getContentHash(): string;
+ setContentHash(value: string): void;
+
+ clearAliasesList(): void;
+ getAliasesList(): Array;
+ setAliasesList(value: Array): void;
+ addAliases(value: string, index?: number): string;
+
+ getRepositoryName(): string;
+ setRepositoryName(value: string): void;
+
+ getRepositoryOwner(): string;
+ setRepositoryOwner(value: string): void;
+
+ getRepositoryType(): proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ setRepositoryType(
+ value: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap]
+ ): void;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCommitHash(): string;
+ setCommitHash(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): UpdateCodeReferenceRequest.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: UpdateCodeReferenceRequest
+ ): UpdateCodeReferenceRequest.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: UpdateCodeReferenceRequest,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): UpdateCodeReferenceRequest;
+ static deserializeBinaryFromReader(
+ message: UpdateCodeReferenceRequest,
+ reader: jspb.BinaryReader
+ ): UpdateCodeReferenceRequest;
+}
+
+export namespace UpdateCodeReferenceRequest {
+ export type AsObject = {
+ id: string;
+ environmentId: string;
+ filePath: string;
+ lineNumber: number;
+ codeSnippet: string;
+ contentHash: string;
+ aliasesList: Array;
+ repositoryName: string;
+ repositoryOwner: string;
+ repositoryType: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ repositoryBranch: string;
+ commitHash: string;
+ };
+}
+
+export class UpdateCodeReferenceResponse extends jspb.Message {
+ hasCodeReference(): boolean;
+ clearCodeReference(): void;
+ getCodeReference(): proto_coderef_code_reference_pb.CodeReference | undefined;
+ setCodeReference(value?: proto_coderef_code_reference_pb.CodeReference): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): UpdateCodeReferenceResponse.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: UpdateCodeReferenceResponse
+ ): UpdateCodeReferenceResponse.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: UpdateCodeReferenceResponse,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): UpdateCodeReferenceResponse;
+ static deserializeBinaryFromReader(
+ message: UpdateCodeReferenceResponse,
+ reader: jspb.BinaryReader
+ ): UpdateCodeReferenceResponse;
+}
+
+export namespace UpdateCodeReferenceResponse {
+ export type AsObject = {
+ codeReference?: proto_coderef_code_reference_pb.CodeReference.AsObject;
+ };
+}
+
+export class DeleteCodeReferenceRequest extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): DeleteCodeReferenceRequest.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: DeleteCodeReferenceRequest
+ ): DeleteCodeReferenceRequest.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: DeleteCodeReferenceRequest,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): DeleteCodeReferenceRequest;
+ static deserializeBinaryFromReader(
+ message: DeleteCodeReferenceRequest,
+ reader: jspb.BinaryReader
+ ): DeleteCodeReferenceRequest;
+}
+
+export namespace DeleteCodeReferenceRequest {
+ export type AsObject = {
+ id: string;
+ environmentId: string;
+ };
+}
+
+export class DeleteCodeReferenceResponse extends jspb.Message {
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): DeleteCodeReferenceResponse.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: DeleteCodeReferenceResponse
+ ): DeleteCodeReferenceResponse.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: DeleteCodeReferenceResponse,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): DeleteCodeReferenceResponse;
+ static deserializeBinaryFromReader(
+ message: DeleteCodeReferenceResponse,
+ reader: jspb.BinaryReader
+ ): DeleteCodeReferenceResponse;
+}
+
+export namespace DeleteCodeReferenceResponse {
+ export type AsObject = {};
+}
diff --git a/ui/web-v2/src/proto/coderef/service_pb.js b/ui/web-v2/src/proto/coderef/service_pb.js
new file mode 100644
index 0000000000..ff79948fd7
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/service_pb.js
@@ -0,0 +1,2975 @@
+// source: proto/coderef/service.proto
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {missingRequire} reports error on implicit type usages.
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+/* eslint-disable */
+// @ts-nocheck
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global =
+ (typeof globalThis !== 'undefined' && globalThis) ||
+ (typeof window !== 'undefined' && window) ||
+ (typeof global !== 'undefined' && global) ||
+ (typeof self !== 'undefined' && self) ||
+ function () {
+ return this;
+ }.call(null) ||
+ Function('return this')();
+
+var proto_coderef_code_reference_pb = require('../../proto/coderef/code_reference_pb.js');
+goog.object.extend(proto, proto_coderef_code_reference_pb);
+var google_api_annotations_pb = require('../../google/api/annotations_pb.js');
+goog.object.extend(proto, google_api_annotations_pb);
+var protoc$gen$openapiv2_options_annotations_pb = require('../../protoc-gen-openapiv2/options/annotations_pb.js');
+goog.object.extend(proto, protoc$gen$openapiv2_options_annotations_pb);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.CreateCodeReferenceRequest',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.CreateCodeReferenceResponse',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.DeleteCodeReferenceRequest',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.DeleteCodeReferenceResponse',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.GetCodeReferenceRequest',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.GetCodeReferenceResponse',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.ListCodeReferencesRequest',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.ListCodeReferencesResponse',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.UpdateCodeReferenceRequest',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.coderef.UpdateCodeReferenceResponse',
+ null,
+ global
+);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.bucketeer.coderef.GetCodeReferenceRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.GetCodeReferenceRequest.displayName =
+ 'proto.bucketeer.coderef.GetCodeReferenceRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.bucketeer.coderef.GetCodeReferenceResponse, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.GetCodeReferenceResponse.displayName =
+ 'proto.bucketeer.coderef.GetCodeReferenceResponse';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.bucketeer.coderef.ListCodeReferencesRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.ListCodeReferencesRequest.displayName =
+ 'proto.bucketeer.coderef.ListCodeReferencesRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.coderef.ListCodeReferencesResponse.repeatedFields_,
+ null
+ );
+};
+goog.inherits(proto.bucketeer.coderef.ListCodeReferencesResponse, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.ListCodeReferencesResponse.displayName =
+ 'proto.bucketeer.coderef.ListCodeReferencesResponse';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.coderef.CreateCodeReferenceRequest.repeatedFields_,
+ null
+ );
+};
+goog.inherits(proto.bucketeer.coderef.CreateCodeReferenceRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceRequest.displayName =
+ 'proto.bucketeer.coderef.CreateCodeReferenceRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(
+ proto.bucketeer.coderef.CreateCodeReferenceResponse,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceResponse.displayName =
+ 'proto.bucketeer.coderef.CreateCodeReferenceResponse';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.coderef.UpdateCodeReferenceRequest.repeatedFields_,
+ null
+ );
+};
+goog.inherits(proto.bucketeer.coderef.UpdateCodeReferenceRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceRequest.displayName =
+ 'proto.bucketeer.coderef.UpdateCodeReferenceRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(
+ proto.bucketeer.coderef.UpdateCodeReferenceResponse,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceResponse.displayName =
+ 'proto.bucketeer.coderef.UpdateCodeReferenceResponse';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.bucketeer.coderef.DeleteCodeReferenceRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceRequest.displayName =
+ 'proto.bucketeer.coderef.DeleteCodeReferenceRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceResponse = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(
+ proto.bucketeer.coderef.DeleteCodeReferenceResponse,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceResponse.displayName =
+ 'proto.bucketeer.coderef.DeleteCodeReferenceResponse';
+}
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.GetCodeReferenceRequest.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.GetCodeReferenceRequest.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 2, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.deserializeBinary = function (
+ bytes
+) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.GetCodeReferenceRequest();
+ return proto.bucketeer.coderef.GetCodeReferenceRequest.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.GetCodeReferenceRequest.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.getId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * optional string environment_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.GetCodeReferenceRequest.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.GetCodeReferenceResponse.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceResponse} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.GetCodeReferenceResponse.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ codeReference:
+ (f = msg.getCodeReference()) &&
+ proto_coderef_code_reference_pb.CodeReference.toObject(
+ includeInstance,
+ f
+ )
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.deserializeBinary = function (
+ bytes
+) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.GetCodeReferenceResponse();
+ return proto.bucketeer.coderef.GetCodeReferenceResponse.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceResponse} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto_coderef_code_reference_pb.CodeReference();
+ reader.readMessage(
+ value,
+ proto_coderef_code_reference_pb.CodeReference
+ .deserializeBinaryFromReader
+ );
+ msg.setCodeReference(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.GetCodeReferenceResponse.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.GetCodeReferenceResponse} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getCodeReference();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto_coderef_code_reference_pb.CodeReference.serializeBinaryToWriter
+ );
+ }
+ };
+
+/**
+ * optional CodeReference code_reference = 1;
+ * @return {?proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.getCodeReference =
+ function () {
+ return /** @type{?proto.bucketeer.coderef.CodeReference} */ (
+ jspb.Message.getWrapperField(
+ this,
+ proto_coderef_code_reference_pb.CodeReference,
+ 1
+ )
+ );
+ };
+
+/**
+ * @param {?proto.bucketeer.coderef.CodeReference|undefined} value
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.setCodeReference =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 1, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.coderef.GetCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.clearCodeReference =
+ function () {
+ return this.setCodeReference(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.coderef.GetCodeReferenceResponse.prototype.hasCodeReference =
+ function () {
+ return jspb.Message.getField(this, 1) != null;
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.ListCodeReferencesRequest.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.ListCodeReferencesRequest.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ environmentId: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ featureId: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ repositoryName: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ repositoryOwner: jspb.Message.getFieldWithDefault(msg, 4, ''),
+ repositoryType: jspb.Message.getFieldWithDefault(msg, 5, 0),
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ cursor: jspb.Message.getFieldWithDefault(msg, 7, ''),
+ pageSize: jspb.Message.getFieldWithDefault(msg, 8, 0),
+ orderBy: jspb.Message.getFieldWithDefault(msg, 9, 0),
+ orderDirection: jspb.Message.getFieldWithDefault(msg, 10, 0),
+ fileExtension: jspb.Message.getFieldWithDefault(msg, 11, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.deserializeBinary = function (
+ bytes
+) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.ListCodeReferencesRequest();
+ return proto.bucketeer.coderef.ListCodeReferencesRequest.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFeatureId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryName(value);
+ break;
+ case 4:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryOwner(value);
+ break;
+ case 5:
+ var value =
+ /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ reader.readEnum()
+ );
+ msg.setRepositoryType(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCursor(value);
+ break;
+ case 8:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setPageSize(value);
+ break;
+ case 9:
+ var value =
+ /** @type {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy} */ (
+ reader.readEnum()
+ );
+ msg.setOrderBy(value);
+ break;
+ case 10:
+ var value =
+ /** @type {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection} */ (
+ reader.readEnum()
+ );
+ msg.setOrderDirection(value);
+ break;
+ case 11:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFileExtension(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.ListCodeReferencesRequest.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getFeatureId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getRepositoryName();
+ if (f.length > 0) {
+ writer.writeString(3, f);
+ }
+ f = message.getRepositoryOwner();
+ if (f.length > 0) {
+ writer.writeString(4, f);
+ }
+ f = message.getRepositoryType();
+ if (f !== 0.0) {
+ writer.writeEnum(5, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(6, f);
+ }
+ f = message.getCursor();
+ if (f.length > 0) {
+ writer.writeString(7, f);
+ }
+ f = message.getPageSize();
+ if (f !== 0) {
+ writer.writeInt64(8, f);
+ }
+ f = message.getOrderBy();
+ if (f !== 0.0) {
+ writer.writeEnum(9, f);
+ }
+ f = message.getOrderDirection();
+ if (f !== 0.0) {
+ writer.writeEnum(10, f);
+ }
+ f = message.getFileExtension();
+ if (f.length > 0) {
+ writer.writeString(11, f);
+ }
+ };
+
+/**
+ * @enum {number}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy = {
+ DEFAULT: 0,
+ CREATED_AT: 1,
+ UPDATED_AT: 2
+};
+
+/**
+ * @enum {number}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection = {
+ ASC: 0,
+ DESC: 1
+};
+
+/**
+ * optional string environment_id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string feature_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getFeatureId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setFeatureId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional string repository_name = 3;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getRepositoryName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 3, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setRepositoryName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 3, value);
+ };
+
+/**
+ * optional string repository_owner = 4;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getRepositoryOwner =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 4, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setRepositoryOwner =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 4, value);
+ };
+
+/**
+ * optional CodeReference.RepositoryType repository_type = 5;
+ * @return {!proto.bucketeer.coderef.CodeReference.RepositoryType}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getRepositoryType =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ jspb.Message.getFieldWithDefault(this, 5, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference.RepositoryType} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setRepositoryType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 5, value);
+ };
+
+/**
+ * optional string repository_branch = 6;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 6, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setRepositoryBranch =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 6, value);
+ };
+
+/**
+ * optional string cursor = 7;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getCursor =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 7, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setCursor =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 7, value);
+ };
+
+/**
+ * optional int64 page_size = 8;
+ * @return {number}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getPageSize =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setPageSize =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 8, value);
+ };
+
+/**
+ * optional OrderBy order_by = 9;
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getOrderBy =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy} */ (
+ jspb.Message.getFieldWithDefault(this, 9, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderBy} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setOrderBy =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 9, value);
+ };
+
+/**
+ * optional OrderDirection order_direction = 10;
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getOrderDirection =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesRequest.OrderDirection} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setOrderDirection =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 10, value);
+ };
+
+/**
+ * optional string file_extension = 11;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.getFileExtension =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 11, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesRequest} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesRequest.prototype.setFileExtension =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 11, value);
+ };
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.repeatedFields_ = [1];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.ListCodeReferencesResponse.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesResponse} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.ListCodeReferencesResponse.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ codeReferencesList: jspb.Message.toObjectList(
+ msg.getCodeReferencesList(),
+ proto_coderef_code_reference_pb.CodeReference.toObject,
+ includeInstance
+ ),
+ cursor: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ totalCount: jspb.Message.getFieldWithDefault(msg, 3, 0)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.ListCodeReferencesResponse();
+ return proto.bucketeer.coderef.ListCodeReferencesResponse.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesResponse} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto_coderef_code_reference_pb.CodeReference();
+ reader.readMessage(
+ value,
+ proto_coderef_code_reference_pb.CodeReference
+ .deserializeBinaryFromReader
+ );
+ msg.addCodeReferences(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCursor(value);
+ break;
+ case 3:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setTotalCount(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.ListCodeReferencesResponse.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.ListCodeReferencesResponse} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getCodeReferencesList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 1,
+ f,
+ proto_coderef_code_reference_pb.CodeReference.serializeBinaryToWriter
+ );
+ }
+ f = message.getCursor();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getTotalCount();
+ if (f !== 0) {
+ writer.writeInt64(3, f);
+ }
+ };
+
+/**
+ * repeated CodeReference code_references = 1;
+ * @return {!Array}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.getCodeReferencesList =
+ function () {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(
+ this,
+ proto_coderef_code_reference_pb.CodeReference,
+ 1
+ )
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.setCodeReferencesList =
+ function (value) {
+ return jspb.Message.setRepeatedWrapperField(this, 1, value);
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.addCodeReferences =
+ function (opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(
+ this,
+ 1,
+ opt_value,
+ proto.bucketeer.coderef.CodeReference,
+ opt_index
+ );
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.clearCodeReferencesList =
+ function () {
+ return this.setCodeReferencesList([]);
+ };
+
+/**
+ * optional string cursor = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.getCursor =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.setCursor =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional int64 total_count = 3;
+ * @return {number}
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.getTotalCount =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.ListCodeReferencesResponse} returns this
+ */
+proto.bucketeer.coderef.ListCodeReferencesResponse.prototype.setTotalCount =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 3, value);
+ };
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.repeatedFields_ = [7];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.CreateCodeReferenceRequest.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceRequest.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ featureId: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ filePath: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ lineNumber: jspb.Message.getFieldWithDefault(msg, 4, 0),
+ codeSnippet: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ contentHash: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ aliasesList:
+ (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f,
+ repositoryName: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ repositoryOwner: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ repositoryType: jspb.Message.getFieldWithDefault(msg, 10, 0),
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 11, ''),
+ commitHash: jspb.Message.getFieldWithDefault(msg, 12, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.CreateCodeReferenceRequest();
+ return proto.bucketeer.coderef.CreateCodeReferenceRequest.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFeatureId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFilePath(value);
+ break;
+ case 4:
+ var value = /** @type {number} */ (reader.readInt32());
+ msg.setLineNumber(value);
+ break;
+ case 5:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCodeSnippet(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setContentHash(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addAliases(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryName(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryOwner(value);
+ break;
+ case 10:
+ var value =
+ /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ reader.readEnum()
+ );
+ msg.setRepositoryType(value);
+ break;
+ case 11:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 12:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitHash(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.CreateCodeReferenceRequest.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getFeatureId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getFilePath();
+ if (f.length > 0) {
+ writer.writeString(3, f);
+ }
+ f = message.getLineNumber();
+ if (f !== 0) {
+ writer.writeInt32(4, f);
+ }
+ f = message.getCodeSnippet();
+ if (f.length > 0) {
+ writer.writeString(5, f);
+ }
+ f = message.getContentHash();
+ if (f.length > 0) {
+ writer.writeString(6, f);
+ }
+ f = message.getAliasesList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(7, f);
+ }
+ f = message.getRepositoryName();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getRepositoryOwner();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getRepositoryType();
+ if (f !== 0.0) {
+ writer.writeEnum(10, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(11, f);
+ }
+ f = message.getCommitHash();
+ if (f.length > 0) {
+ writer.writeString(12, f);
+ }
+ };
+
+/**
+ * optional string feature_id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getFeatureId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setFeatureId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string environment_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional string file_path = 3;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getFilePath =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 3, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setFilePath =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 3, value);
+ };
+
+/**
+ * optional int32 line_number = 4;
+ * @return {number}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getLineNumber =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setLineNumber =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 4, value);
+ };
+
+/**
+ * optional string code_snippet = 5;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getCodeSnippet =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 5, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setCodeSnippet =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 5, value);
+ };
+
+/**
+ * optional string content_hash = 6;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getContentHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 6, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setContentHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 6, value);
+ };
+
+/**
+ * repeated string aliases = 7;
+ * @return {!Array}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getAliasesList =
+ function () {
+ return /** @type {!Array} */ (
+ jspb.Message.getRepeatedField(this, 7)
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setAliasesList =
+ function (value) {
+ return jspb.Message.setField(this, 7, value || []);
+ };
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.addAliases =
+ function (value, opt_index) {
+ return jspb.Message.addToRepeatedField(this, 7, value, opt_index);
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.clearAliasesList =
+ function () {
+ return this.setAliasesList([]);
+ };
+
+/**
+ * optional string repository_name = 8;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getRepositoryName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setRepositoryName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+ };
+
+/**
+ * optional string repository_owner = 9;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getRepositoryOwner =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setRepositoryOwner =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+ };
+
+/**
+ * optional CodeReference.RepositoryType repository_type = 10;
+ * @return {!proto.bucketeer.coderef.CodeReference.RepositoryType}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getRepositoryType =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference.RepositoryType} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setRepositoryType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 10, value);
+ };
+
+/**
+ * optional string repository_branch = 11;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 11, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setRepositoryBranch =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 11, value);
+ };
+
+/**
+ * optional string commit_hash = 12;
+ * @return {string}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.getCommitHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 12, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceRequest.prototype.setCommitHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 12, value);
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.CreateCodeReferenceResponse.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceResponse} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.CreateCodeReferenceResponse.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ codeReference:
+ (f = msg.getCodeReference()) &&
+ proto_coderef_code_reference_pb.CodeReference.toObject(
+ includeInstance,
+ f
+ )
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.CreateCodeReferenceResponse();
+ return proto.bucketeer.coderef.CreateCodeReferenceResponse.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceResponse} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto_coderef_code_reference_pb.CodeReference();
+ reader.readMessage(
+ value,
+ proto_coderef_code_reference_pb.CodeReference
+ .deserializeBinaryFromReader
+ );
+ msg.setCodeReference(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.CreateCodeReferenceResponse.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.CreateCodeReferenceResponse} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getCodeReference();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto_coderef_code_reference_pb.CodeReference.serializeBinaryToWriter
+ );
+ }
+ };
+
+/**
+ * optional CodeReference code_reference = 1;
+ * @return {?proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.getCodeReference =
+ function () {
+ return /** @type{?proto.bucketeer.coderef.CodeReference} */ (
+ jspb.Message.getWrapperField(
+ this,
+ proto_coderef_code_reference_pb.CodeReference,
+ 1
+ )
+ );
+ };
+
+/**
+ * @param {?proto.bucketeer.coderef.CodeReference|undefined} value
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.setCodeReference =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 1, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.coderef.CreateCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.clearCodeReference =
+ function () {
+ return this.setCodeReference(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.coderef.CreateCodeReferenceResponse.prototype.hasCodeReference =
+ function () {
+ return jspb.Message.getField(this, 1) != null;
+ };
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.repeatedFields_ = [7];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.UpdateCodeReferenceRequest.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceRequest.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ filePath: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ lineNumber: jspb.Message.getFieldWithDefault(msg, 4, 0),
+ codeSnippet: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ contentHash: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ aliasesList:
+ (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f,
+ repositoryName: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ repositoryOwner: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ repositoryType: jspb.Message.getFieldWithDefault(msg, 10, 0),
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 11, ''),
+ commitHash: jspb.Message.getFieldWithDefault(msg, 12, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.UpdateCodeReferenceRequest();
+ return proto.bucketeer.coderef.UpdateCodeReferenceRequest.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFilePath(value);
+ break;
+ case 4:
+ var value = /** @type {number} */ (reader.readInt32());
+ msg.setLineNumber(value);
+ break;
+ case 5:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCodeSnippet(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setContentHash(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addAliases(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryName(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryOwner(value);
+ break;
+ case 10:
+ var value =
+ /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ reader.readEnum()
+ );
+ msg.setRepositoryType(value);
+ break;
+ case 11:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 12:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitHash(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.UpdateCodeReferenceRequest.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getFilePath();
+ if (f.length > 0) {
+ writer.writeString(3, f);
+ }
+ f = message.getLineNumber();
+ if (f !== 0) {
+ writer.writeInt32(4, f);
+ }
+ f = message.getCodeSnippet();
+ if (f.length > 0) {
+ writer.writeString(5, f);
+ }
+ f = message.getContentHash();
+ if (f.length > 0) {
+ writer.writeString(6, f);
+ }
+ f = message.getAliasesList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(7, f);
+ }
+ f = message.getRepositoryName();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getRepositoryOwner();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getRepositoryType();
+ if (f !== 0.0) {
+ writer.writeEnum(10, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(11, f);
+ }
+ f = message.getCommitHash();
+ if (f.length > 0) {
+ writer.writeString(12, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * optional string environment_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional string file_path = 3;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getFilePath =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 3, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setFilePath =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 3, value);
+ };
+
+/**
+ * optional int32 line_number = 4;
+ * @return {number}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getLineNumber =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setLineNumber =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 4, value);
+ };
+
+/**
+ * optional string code_snippet = 5;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getCodeSnippet =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 5, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setCodeSnippet =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 5, value);
+ };
+
+/**
+ * optional string content_hash = 6;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getContentHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 6, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setContentHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 6, value);
+ };
+
+/**
+ * repeated string aliases = 7;
+ * @return {!Array}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getAliasesList =
+ function () {
+ return /** @type {!Array} */ (
+ jspb.Message.getRepeatedField(this, 7)
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setAliasesList =
+ function (value) {
+ return jspb.Message.setField(this, 7, value || []);
+ };
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.addAliases =
+ function (value, opt_index) {
+ return jspb.Message.addToRepeatedField(this, 7, value, opt_index);
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.clearAliasesList =
+ function () {
+ return this.setAliasesList([]);
+ };
+
+/**
+ * optional string repository_name = 8;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getRepositoryName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setRepositoryName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+ };
+
+/**
+ * optional string repository_owner = 9;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getRepositoryOwner =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setRepositoryOwner =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+ };
+
+/**
+ * optional CodeReference.RepositoryType repository_type = 10;
+ * @return {!proto.bucketeer.coderef.CodeReference.RepositoryType}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getRepositoryType =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference.RepositoryType} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setRepositoryType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 10, value);
+ };
+
+/**
+ * optional string repository_branch = 11;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 11, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setRepositoryBranch =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 11, value);
+ };
+
+/**
+ * optional string commit_hash = 12;
+ * @return {string}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.getCommitHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 12, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceRequest.prototype.setCommitHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 12, value);
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.UpdateCodeReferenceResponse.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceResponse} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.UpdateCodeReferenceResponse.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ codeReference:
+ (f = msg.getCodeReference()) &&
+ proto_coderef_code_reference_pb.CodeReference.toObject(
+ includeInstance,
+ f
+ )
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.UpdateCodeReferenceResponse();
+ return proto.bucketeer.coderef.UpdateCodeReferenceResponse.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceResponse} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto_coderef_code_reference_pb.CodeReference();
+ reader.readMessage(
+ value,
+ proto_coderef_code_reference_pb.CodeReference
+ .deserializeBinaryFromReader
+ );
+ msg.setCodeReference(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.UpdateCodeReferenceResponse.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.UpdateCodeReferenceResponse} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getCodeReference();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto_coderef_code_reference_pb.CodeReference.serializeBinaryToWriter
+ );
+ }
+ };
+
+/**
+ * optional CodeReference code_reference = 1;
+ * @return {?proto.bucketeer.coderef.CodeReference}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.getCodeReference =
+ function () {
+ return /** @type{?proto.bucketeer.coderef.CodeReference} */ (
+ jspb.Message.getWrapperField(
+ this,
+ proto_coderef_code_reference_pb.CodeReference,
+ 1
+ )
+ );
+ };
+
+/**
+ * @param {?proto.bucketeer.coderef.CodeReference|undefined} value
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.setCodeReference =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 1, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.coderef.UpdateCodeReferenceResponse} returns this
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.clearCodeReference =
+ function () {
+ return this.setCodeReference(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.coderef.UpdateCodeReferenceResponse.prototype.hasCodeReference =
+ function () {
+ return jspb.Message.getField(this, 1) != null;
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.DeleteCodeReferenceRequest.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceRequest.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 2, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.DeleteCodeReferenceRequest();
+ return proto.bucketeer.coderef.DeleteCodeReferenceRequest.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceRequest}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.DeleteCodeReferenceRequest.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * optional string environment_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceRequest} returns this
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceRequest.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceResponse.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.coderef.DeleteCodeReferenceResponse.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceResponse} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.coderef.DeleteCodeReferenceResponse.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {};
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceResponse.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.coderef.DeleteCodeReferenceResponse();
+ return proto.bucketeer.coderef.DeleteCodeReferenceResponse.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceResponse} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.coderef.DeleteCodeReferenceResponse}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceResponse.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceResponse.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.coderef.DeleteCodeReferenceResponse.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.coderef.DeleteCodeReferenceResponse} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.coderef.DeleteCodeReferenceResponse.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ };
+
+goog.object.extend(exports, proto.bucketeer.coderef);
diff --git a/ui/web-v2/src/proto/coderef/service_pb_service.d.ts b/ui/web-v2/src/proto/coderef/service_pb_service.d.ts
new file mode 100644
index 0000000000..a5cc2f70a0
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/service_pb_service.d.ts
@@ -0,0 +1,181 @@
+// package: bucketeer.coderef
+// file: proto/coderef/service.proto
+
+import * as proto_coderef_service_pb from '../../proto/coderef/service_pb';
+import { grpc } from '@improbable-eng/grpc-web';
+
+type CodeReferenceServiceGetCodeReference = {
+ readonly methodName: string;
+ readonly service: typeof CodeReferenceService;
+ readonly requestStream: false;
+ readonly responseStream: false;
+ readonly requestType: typeof proto_coderef_service_pb.GetCodeReferenceRequest;
+ readonly responseType: typeof proto_coderef_service_pb.GetCodeReferenceResponse;
+};
+
+type CodeReferenceServiceListCodeReferences = {
+ readonly methodName: string;
+ readonly service: typeof CodeReferenceService;
+ readonly requestStream: false;
+ readonly responseStream: false;
+ readonly requestType: typeof proto_coderef_service_pb.ListCodeReferencesRequest;
+ readonly responseType: typeof proto_coderef_service_pb.ListCodeReferencesResponse;
+};
+
+type CodeReferenceServiceCreateCodeReference = {
+ readonly methodName: string;
+ readonly service: typeof CodeReferenceService;
+ readonly requestStream: false;
+ readonly responseStream: false;
+ readonly requestType: typeof proto_coderef_service_pb.CreateCodeReferenceRequest;
+ readonly responseType: typeof proto_coderef_service_pb.CreateCodeReferenceResponse;
+};
+
+type CodeReferenceServiceUpdateCodeReference = {
+ readonly methodName: string;
+ readonly service: typeof CodeReferenceService;
+ readonly requestStream: false;
+ readonly responseStream: false;
+ readonly requestType: typeof proto_coderef_service_pb.UpdateCodeReferenceRequest;
+ readonly responseType: typeof proto_coderef_service_pb.UpdateCodeReferenceResponse;
+};
+
+type CodeReferenceServiceDeleteCodeReference = {
+ readonly methodName: string;
+ readonly service: typeof CodeReferenceService;
+ readonly requestStream: false;
+ readonly responseStream: false;
+ readonly requestType: typeof proto_coderef_service_pb.DeleteCodeReferenceRequest;
+ readonly responseType: typeof proto_coderef_service_pb.DeleteCodeReferenceResponse;
+};
+
+export class CodeReferenceService {
+ static readonly serviceName: string;
+ static readonly GetCodeReference: CodeReferenceServiceGetCodeReference;
+ static readonly ListCodeReferences: CodeReferenceServiceListCodeReferences;
+ static readonly CreateCodeReference: CodeReferenceServiceCreateCodeReference;
+ static readonly UpdateCodeReference: CodeReferenceServiceUpdateCodeReference;
+ static readonly DeleteCodeReference: CodeReferenceServiceDeleteCodeReference;
+}
+
+export type ServiceError = {
+ message: string;
+ code: number;
+ metadata: grpc.Metadata;
+};
+export type Status = { details: string; code: number; metadata: grpc.Metadata };
+
+interface UnaryResponse {
+ cancel(): void;
+}
+interface ResponseStream {
+ cancel(): void;
+ on(type: 'data', handler: (message: T) => void): ResponseStream;
+ on(type: 'end', handler: (status?: Status) => void): ResponseStream;
+ on(type: 'status', handler: (status: Status) => void): ResponseStream;
+}
+interface RequestStream {
+ write(message: T): RequestStream;
+ end(): void;
+ cancel(): void;
+ on(type: 'end', handler: (status?: Status) => void): RequestStream;
+ on(type: 'status', handler: (status: Status) => void): RequestStream;
+}
+interface BidirectionalStream {
+ write(message: ReqT): BidirectionalStream;
+ end(): void;
+ cancel(): void;
+ on(
+ type: 'data',
+ handler: (message: ResT) => void
+ ): BidirectionalStream;
+ on(
+ type: 'end',
+ handler: (status?: Status) => void
+ ): BidirectionalStream;
+ on(
+ type: 'status',
+ handler: (status: Status) => void
+ ): BidirectionalStream;
+}
+
+export class CodeReferenceServiceClient {
+ readonly serviceHost: string;
+
+ constructor(serviceHost: string, options?: grpc.RpcOptions);
+ getCodeReference(
+ requestMessage: proto_coderef_service_pb.GetCodeReferenceRequest,
+ metadata: grpc.Metadata,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.GetCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ getCodeReference(
+ requestMessage: proto_coderef_service_pb.GetCodeReferenceRequest,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.GetCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ listCodeReferences(
+ requestMessage: proto_coderef_service_pb.ListCodeReferencesRequest,
+ metadata: grpc.Metadata,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.ListCodeReferencesResponse | null
+ ) => void
+ ): UnaryResponse;
+ listCodeReferences(
+ requestMessage: proto_coderef_service_pb.ListCodeReferencesRequest,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.ListCodeReferencesResponse | null
+ ) => void
+ ): UnaryResponse;
+ createCodeReference(
+ requestMessage: proto_coderef_service_pb.CreateCodeReferenceRequest,
+ metadata: grpc.Metadata,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.CreateCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ createCodeReference(
+ requestMessage: proto_coderef_service_pb.CreateCodeReferenceRequest,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.CreateCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ updateCodeReference(
+ requestMessage: proto_coderef_service_pb.UpdateCodeReferenceRequest,
+ metadata: grpc.Metadata,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.UpdateCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ updateCodeReference(
+ requestMessage: proto_coderef_service_pb.UpdateCodeReferenceRequest,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.UpdateCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ deleteCodeReference(
+ requestMessage: proto_coderef_service_pb.DeleteCodeReferenceRequest,
+ metadata: grpc.Metadata,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.DeleteCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+ deleteCodeReference(
+ requestMessage: proto_coderef_service_pb.DeleteCodeReferenceRequest,
+ callback: (
+ error: ServiceError | null,
+ responseMessage: proto_coderef_service_pb.DeleteCodeReferenceResponse | null
+ ) => void
+ ): UnaryResponse;
+}
diff --git a/ui/web-v2/src/proto/coderef/service_pb_service.js b/ui/web-v2/src/proto/coderef/service_pb_service.js
new file mode 100644
index 0000000000..6290b7eceb
--- /dev/null
+++ b/ui/web-v2/src/proto/coderef/service_pb_service.js
@@ -0,0 +1,225 @@
+// package: bucketeer.coderef
+// file: proto/coderef/service.proto
+
+var proto_coderef_service_pb = require('../../proto/coderef/service_pb');
+var grpc = require('@improbable-eng/grpc-web').grpc;
+
+var CodeReferenceService = (function () {
+ function CodeReferenceService() {}
+ CodeReferenceService.serviceName = 'bucketeer.coderef.CodeReferenceService';
+ return CodeReferenceService;
+})();
+
+CodeReferenceService.GetCodeReference = {
+ methodName: 'GetCodeReference',
+ service: CodeReferenceService,
+ requestStream: false,
+ responseStream: false,
+ requestType: proto_coderef_service_pb.GetCodeReferenceRequest,
+ responseType: proto_coderef_service_pb.GetCodeReferenceResponse
+};
+
+CodeReferenceService.ListCodeReferences = {
+ methodName: 'ListCodeReferences',
+ service: CodeReferenceService,
+ requestStream: false,
+ responseStream: false,
+ requestType: proto_coderef_service_pb.ListCodeReferencesRequest,
+ responseType: proto_coderef_service_pb.ListCodeReferencesResponse
+};
+
+CodeReferenceService.CreateCodeReference = {
+ methodName: 'CreateCodeReference',
+ service: CodeReferenceService,
+ requestStream: false,
+ responseStream: false,
+ requestType: proto_coderef_service_pb.CreateCodeReferenceRequest,
+ responseType: proto_coderef_service_pb.CreateCodeReferenceResponse
+};
+
+CodeReferenceService.UpdateCodeReference = {
+ methodName: 'UpdateCodeReference',
+ service: CodeReferenceService,
+ requestStream: false,
+ responseStream: false,
+ requestType: proto_coderef_service_pb.UpdateCodeReferenceRequest,
+ responseType: proto_coderef_service_pb.UpdateCodeReferenceResponse
+};
+
+CodeReferenceService.DeleteCodeReference = {
+ methodName: 'DeleteCodeReference',
+ service: CodeReferenceService,
+ requestStream: false,
+ responseStream: false,
+ requestType: proto_coderef_service_pb.DeleteCodeReferenceRequest,
+ responseType: proto_coderef_service_pb.DeleteCodeReferenceResponse
+};
+
+exports.CodeReferenceService = CodeReferenceService;
+
+function CodeReferenceServiceClient(serviceHost, options) {
+ this.serviceHost = serviceHost;
+ this.options = options || {};
+}
+
+CodeReferenceServiceClient.prototype.getCodeReference =
+ function getCodeReference(requestMessage, metadata, callback) {
+ if (arguments.length === 2) {
+ callback = arguments[1];
+ }
+ var client = grpc.unary(CodeReferenceService.GetCodeReference, {
+ request: requestMessage,
+ host: this.serviceHost,
+ metadata: metadata,
+ transport: this.options.transport,
+ debug: this.options.debug,
+ onEnd: function (response) {
+ if (callback) {
+ if (response.status !== grpc.Code.OK) {
+ var err = new Error(response.statusMessage);
+ err.code = response.status;
+ err.metadata = response.trailers;
+ callback(err, null);
+ } else {
+ callback(null, response.message);
+ }
+ }
+ }
+ });
+ return {
+ cancel: function () {
+ callback = null;
+ client.close();
+ }
+ };
+ };
+
+CodeReferenceServiceClient.prototype.listCodeReferences =
+ function listCodeReferences(requestMessage, metadata, callback) {
+ if (arguments.length === 2) {
+ callback = arguments[1];
+ }
+ var client = grpc.unary(CodeReferenceService.ListCodeReferences, {
+ request: requestMessage,
+ host: this.serviceHost,
+ metadata: metadata,
+ transport: this.options.transport,
+ debug: this.options.debug,
+ onEnd: function (response) {
+ if (callback) {
+ if (response.status !== grpc.Code.OK) {
+ var err = new Error(response.statusMessage);
+ err.code = response.status;
+ err.metadata = response.trailers;
+ callback(err, null);
+ } else {
+ callback(null, response.message);
+ }
+ }
+ }
+ });
+ return {
+ cancel: function () {
+ callback = null;
+ client.close();
+ }
+ };
+ };
+
+CodeReferenceServiceClient.prototype.createCodeReference =
+ function createCodeReference(requestMessage, metadata, callback) {
+ if (arguments.length === 2) {
+ callback = arguments[1];
+ }
+ var client = grpc.unary(CodeReferenceService.CreateCodeReference, {
+ request: requestMessage,
+ host: this.serviceHost,
+ metadata: metadata,
+ transport: this.options.transport,
+ debug: this.options.debug,
+ onEnd: function (response) {
+ if (callback) {
+ if (response.status !== grpc.Code.OK) {
+ var err = new Error(response.statusMessage);
+ err.code = response.status;
+ err.metadata = response.trailers;
+ callback(err, null);
+ } else {
+ callback(null, response.message);
+ }
+ }
+ }
+ });
+ return {
+ cancel: function () {
+ callback = null;
+ client.close();
+ }
+ };
+ };
+
+CodeReferenceServiceClient.prototype.updateCodeReference =
+ function updateCodeReference(requestMessage, metadata, callback) {
+ if (arguments.length === 2) {
+ callback = arguments[1];
+ }
+ var client = grpc.unary(CodeReferenceService.UpdateCodeReference, {
+ request: requestMessage,
+ host: this.serviceHost,
+ metadata: metadata,
+ transport: this.options.transport,
+ debug: this.options.debug,
+ onEnd: function (response) {
+ if (callback) {
+ if (response.status !== grpc.Code.OK) {
+ var err = new Error(response.statusMessage);
+ err.code = response.status;
+ err.metadata = response.trailers;
+ callback(err, null);
+ } else {
+ callback(null, response.message);
+ }
+ }
+ }
+ });
+ return {
+ cancel: function () {
+ callback = null;
+ client.close();
+ }
+ };
+ };
+
+CodeReferenceServiceClient.prototype.deleteCodeReference =
+ function deleteCodeReference(requestMessage, metadata, callback) {
+ if (arguments.length === 2) {
+ callback = arguments[1];
+ }
+ var client = grpc.unary(CodeReferenceService.DeleteCodeReference, {
+ request: requestMessage,
+ host: this.serviceHost,
+ metadata: metadata,
+ transport: this.options.transport,
+ debug: this.options.debug,
+ onEnd: function (response) {
+ if (callback) {
+ if (response.status !== grpc.Code.OK) {
+ var err = new Error(response.statusMessage);
+ err.code = response.status;
+ err.metadata = response.trailers;
+ callback(err, null);
+ } else {
+ callback(null, response.message);
+ }
+ }
+ }
+ });
+ return {
+ cancel: function () {
+ callback = null;
+ client.close();
+ }
+ };
+ };
+
+exports.CodeReferenceServiceClient = CodeReferenceServiceClient;
diff --git a/ui/web-v2/src/proto/event/domain/event_pb.d.ts b/ui/web-v2/src/proto/event/domain/event_pb.d.ts
index 8940341bac..f9cdde9f76 100644
--- a/ui/web-v2/src/proto/event/domain/event_pb.d.ts
+++ b/ui/web-v2/src/proto/event/domain/event_pb.d.ts
@@ -22,6 +22,8 @@ import * as proto_autoops_progressive_rollout_pb from '../../../proto/autoops/pr
import * as proto_feature_flag_trigger_pb from '../../../proto/feature/flag_trigger_pb';
import * as proto_account_search_filter_pb from '../../../proto/account/search_filter_pb';
import * as proto_tag_tag_pb from '../../../proto/tag/tag_pb';
+import * as proto_experiment_goal_pb from '../../../proto/experiment/goal_pb';
+import * as proto_coderef_code_reference_pb from '../../../proto/coderef/code_reference_pb';
export class Event extends jspb.Message {
getId(): string;
@@ -118,6 +120,7 @@ export namespace Event {
ORGANIZATION: 15;
FLAG_TRIGGER: 16;
TAG: 17;
+ CODEREF: 18;
}
export const EntityType: EntityTypeMap;
@@ -167,6 +170,7 @@ export namespace Event {
GOAL_DESCRIPTION_CHANGED: 102;
GOAL_DELETED: 103;
GOAL_ARCHIVED: 104;
+ GOAL_UPDATED: 105;
EXPERIMENT_CREATED: 200;
EXPERIMENT_STOPPED: 201;
EXPERIMENT_START_AT_CHANGED: 202;
@@ -297,6 +301,9 @@ export namespace Event {
FLAG_TRIGGER_USAGE_UPDATED: 1607;
TAG_CREATED: 1701;
TAG_DELETED: 1702;
+ CODE_REFERENCE_CREATED: 1800;
+ CODE_REFERENCE_UPDATED: 1801;
+ CODE_REFERENCE_DELETED: 1802;
}
export const Type: TypeMap;
@@ -1949,6 +1956,11 @@ export class GoalCreatedEvent extends jspb.Message {
getUpdatedAt(): number;
setUpdatedAt(value: number): void;
+ getConnectionType(): proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
+ setConnectionType(
+ value: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap]
+ ): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GoalCreatedEvent.AsObject;
static toObject(
@@ -1978,6 +1990,50 @@ export namespace GoalCreatedEvent {
deleted: boolean;
createdAt: number;
updatedAt: number;
+ connectionType: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
+ };
+}
+
+export class GoalUpdatedEvent extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ hasName(): boolean;
+ clearName(): void;
+ getName(): google_protobuf_wrappers_pb.StringValue | undefined;
+ setName(value?: google_protobuf_wrappers_pb.StringValue): void;
+
+ hasDescription(): boolean;
+ clearDescription(): void;
+ getDescription(): google_protobuf_wrappers_pb.StringValue | undefined;
+ setDescription(value?: google_protobuf_wrappers_pb.StringValue): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GoalUpdatedEvent.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: GoalUpdatedEvent
+ ): GoalUpdatedEvent.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: GoalUpdatedEvent,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): GoalUpdatedEvent;
+ static deserializeBinaryFromReader(
+ message: GoalUpdatedEvent,
+ reader: jspb.BinaryReader
+ ): GoalUpdatedEvent;
+}
+
+export namespace GoalUpdatedEvent {
+ export type AsObject = {
+ id: string;
+ name?: google_protobuf_wrappers_pb.StringValue.AsObject;
+ description?: google_protobuf_wrappers_pb.StringValue.AsObject;
};
}
@@ -7093,3 +7149,198 @@ export namespace TagDeletedEvent {
environmentId: string;
};
}
+
+export class CodeReferenceCreatedEvent extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getFeatureId(): string;
+ setFeatureId(value: string): void;
+
+ getFilePath(): string;
+ setFilePath(value: string): void;
+
+ getLineNumber(): number;
+ setLineNumber(value: number): void;
+
+ getCodeSnippet(): string;
+ setCodeSnippet(value: string): void;
+
+ getContentHash(): string;
+ setContentHash(value: string): void;
+
+ clearAliasesList(): void;
+ getAliasesList(): Array;
+ setAliasesList(value: Array): void;
+ addAliases(value: string, index?: number): string;
+
+ getRepositoryName(): string;
+ setRepositoryName(value: string): void;
+
+ getRepositoryOwner(): string;
+ setRepositoryOwner(value: string): void;
+
+ getRepositoryType(): proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ setRepositoryType(
+ value: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap]
+ ): void;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCommitHash(): string;
+ setCommitHash(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getCreatedAt(): number;
+ setCreatedAt(value: number): void;
+
+ getUpdatedAt(): number;
+ setUpdatedAt(value: number): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CodeReferenceCreatedEvent.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CodeReferenceCreatedEvent
+ ): CodeReferenceCreatedEvent.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CodeReferenceCreatedEvent,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CodeReferenceCreatedEvent;
+ static deserializeBinaryFromReader(
+ message: CodeReferenceCreatedEvent,
+ reader: jspb.BinaryReader
+ ): CodeReferenceCreatedEvent;
+}
+
+export namespace CodeReferenceCreatedEvent {
+ export type AsObject = {
+ id: string;
+ featureId: string;
+ filePath: string;
+ lineNumber: number;
+ codeSnippet: string;
+ contentHash: string;
+ aliasesList: Array;
+ repositoryName: string;
+ repositoryOwner: string;
+ repositoryType: proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap[keyof proto_coderef_code_reference_pb.CodeReference.RepositoryTypeMap];
+ repositoryBranch: string;
+ commitHash: string;
+ environmentId: string;
+ createdAt: number;
+ updatedAt: number;
+ };
+}
+
+export class CodeReferenceUpdatedEvent extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getFilePath(): string;
+ setFilePath(value: string): void;
+
+ getLineNumber(): number;
+ setLineNumber(value: number): void;
+
+ getCodeSnippet(): string;
+ setCodeSnippet(value: string): void;
+
+ getContentHash(): string;
+ setContentHash(value: string): void;
+
+ clearAliasesList(): void;
+ getAliasesList(): Array;
+ setAliasesList(value: Array): void;
+ addAliases(value: string, index?: number): string;
+
+ getRepositoryBranch(): string;
+ setRepositoryBranch(value: string): void;
+
+ getCommitHash(): string;
+ setCommitHash(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ getUpdatedAt(): number;
+ setUpdatedAt(value: number): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CodeReferenceUpdatedEvent.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CodeReferenceUpdatedEvent
+ ): CodeReferenceUpdatedEvent.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CodeReferenceUpdatedEvent,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CodeReferenceUpdatedEvent;
+ static deserializeBinaryFromReader(
+ message: CodeReferenceUpdatedEvent,
+ reader: jspb.BinaryReader
+ ): CodeReferenceUpdatedEvent;
+}
+
+export namespace CodeReferenceUpdatedEvent {
+ export type AsObject = {
+ id: string;
+ filePath: string;
+ lineNumber: number;
+ codeSnippet: string;
+ contentHash: string;
+ aliasesList: Array;
+ repositoryBranch: string;
+ commitHash: string;
+ environmentId: string;
+ updatedAt: number;
+ };
+}
+
+export class CodeReferenceDeletedEvent extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CodeReferenceDeletedEvent.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: CodeReferenceDeletedEvent
+ ): CodeReferenceDeletedEvent.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: CodeReferenceDeletedEvent,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): CodeReferenceDeletedEvent;
+ static deserializeBinaryFromReader(
+ message: CodeReferenceDeletedEvent,
+ reader: jspb.BinaryReader
+ ): CodeReferenceDeletedEvent;
+}
+
+export namespace CodeReferenceDeletedEvent {
+ export type AsObject = {
+ id: string;
+ environmentId: string;
+ };
+}
diff --git a/ui/web-v2/src/proto/event/domain/event_pb.js b/ui/web-v2/src/proto/event/domain/event_pb.js
index 179c073f8b..b821150f52 100644
--- a/ui/web-v2/src/proto/event/domain/event_pb.js
+++ b/ui/web-v2/src/proto/event/domain/event_pb.js
@@ -63,6 +63,10 @@ var proto_account_search_filter_pb = require('../../../proto/account/search_filt
goog.object.extend(proto, proto_account_search_filter_pb);
var proto_tag_tag_pb = require('../../../proto/tag/tag_pb.js');
goog.object.extend(proto, proto_tag_tag_pb);
+var proto_experiment_goal_pb = require('../../../proto/experiment/goal_pb.js');
+goog.object.extend(proto, proto_experiment_goal_pb);
+var proto_coderef_code_reference_pb = require('../../../proto/coderef/code_reference_pb.js');
+goog.object.extend(proto, proto_coderef_code_reference_pb);
goog.exportSymbol(
'proto.bucketeer.event.domain.APIKeyChangedEvent',
null,
@@ -243,6 +247,21 @@ goog.exportSymbol(
null,
global
);
+goog.exportSymbol(
+ 'proto.bucketeer.event.domain.CodeReferenceCreatedEvent',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.event.domain.CodeReferenceDeletedEvent',
+ null,
+ global
+);
+goog.exportSymbol(
+ 'proto.bucketeer.event.domain.CodeReferenceUpdatedEvent',
+ null,
+ global
+);
goog.exportSymbol(
'proto.bucketeer.event.domain.DatetimeClauseAddedEvent',
null,
@@ -561,6 +580,11 @@ goog.exportSymbol(
null,
global
);
+goog.exportSymbol(
+ 'proto.bucketeer.event.domain.GoalUpdatedEvent',
+ null,
+ global
+);
goog.exportSymbol(
'proto.bucketeer.event.domain.OpsEventRateClauseAddedEvent',
null,
@@ -1956,6 +1980,28 @@ if (goog.DEBUG && !COMPILED) {
proto.bucketeer.event.domain.GoalCreatedEvent.displayName =
'proto.bucketeer.event.domain.GoalCreatedEvent';
}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.bucketeer.event.domain.GoalUpdatedEvent, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.event.domain.GoalUpdatedEvent.displayName =
+ 'proto.bucketeer.event.domain.GoalUpdatedEvent';
+}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@@ -5353,6 +5399,95 @@ if (goog.DEBUG && !COMPILED) {
proto.bucketeer.event.domain.TagDeletedEvent.displayName =
'proto.bucketeer.event.domain.TagDeletedEvent';
}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent.repeatedFields_,
+ null
+ );
+};
+goog.inherits(
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent.displayName =
+ 'proto.bucketeer.event.domain.CodeReferenceCreatedEvent';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.repeatedFields_,
+ null
+ );
+};
+goog.inherits(
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.displayName =
+ 'proto.bucketeer.event.domain.CodeReferenceUpdatedEvent';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(
+ proto.bucketeer.event.domain.CodeReferenceDeletedEvent,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.event.domain.CodeReferenceDeletedEvent.displayName =
+ 'proto.bucketeer.event.domain.CodeReferenceDeletedEvent';
+}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
@@ -5626,7 +5761,8 @@ proto.bucketeer.event.domain.Event.EntityType = {
PROGRESSIVE_ROLLOUT: 14,
ORGANIZATION: 15,
FLAG_TRIGGER: 16,
- TAG: 17
+ TAG: 17,
+ CODEREF: 18
};
/**
@@ -5677,6 +5813,7 @@ proto.bucketeer.event.domain.Event.Type = {
GOAL_DESCRIPTION_CHANGED: 102,
GOAL_DELETED: 103,
GOAL_ARCHIVED: 104,
+ GOAL_UPDATED: 105,
EXPERIMENT_CREATED: 200,
EXPERIMENT_STOPPED: 201,
EXPERIMENT_START_AT_CHANGED: 202,
@@ -5806,7 +5943,10 @@ proto.bucketeer.event.domain.Event.Type = {
FLAG_TRIGGER_DELETED: 1606,
FLAG_TRIGGER_USAGE_UPDATED: 1607,
TAG_CREATED: 1701,
- TAG_DELETED: 1702
+ TAG_DELETED: 1702,
+ CODE_REFERENCE_CREATED: 1800,
+ CODE_REFERENCE_UPDATED: 1801,
+ CODE_REFERENCE_DELETED: 1802
};
/**
@@ -14518,7 +14658,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
description: jspb.Message.getFieldWithDefault(msg, 3, ''),
deleted: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
createdAt: jspb.Message.getFieldWithDefault(msg, 5, 0),
- updatedAt: jspb.Message.getFieldWithDefault(msg, 6, 0)
+ updatedAt: jspb.Message.getFieldWithDefault(msg, 6, 0),
+ connectionType: jspb.Message.getFieldWithDefault(msg, 7, 0)
};
if (includeInstance) {
@@ -14583,6 +14724,13 @@ proto.bucketeer.event.domain.GoalCreatedEvent.deserializeBinaryFromReader =
var value = /** @type {number} */ (reader.readInt64());
msg.setUpdatedAt(value);
break;
+ case 7:
+ var value =
+ /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ reader.readEnum()
+ );
+ msg.setConnectionType(value);
+ break;
default:
reader.skipField();
break;
@@ -14639,6 +14787,10 @@ proto.bucketeer.event.domain.GoalCreatedEvent.serializeBinaryToWriter =
if (f !== 0) {
writer.writeInt64(6, f);
}
+ f = message.getConnectionType();
+ if (f !== 0.0) {
+ writer.writeEnum(7, f);
+ }
};
/**
@@ -14754,6 +14906,26 @@ proto.bucketeer.event.domain.GoalCreatedEvent.prototype.setUpdatedAt =
return jspb.Message.setProto3IntField(this, 6, value);
};
+/**
+ * optional bucketeer.experiment.Goal.ConnectionType connection_type = 7;
+ * @return {!proto.bucketeer.experiment.Goal.ConnectionType}
+ */
+proto.bucketeer.event.domain.GoalCreatedEvent.prototype.getConnectionType =
+ function () {
+ return /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ jspb.Message.getFieldWithDefault(this, 7, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.experiment.Goal.ConnectionType} value
+ * @return {!proto.bucketeer.event.domain.GoalCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalCreatedEvent.prototype.setConnectionType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 7, value);
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -14767,10 +14939,10 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* http://goto/soy-param-migration
* @return {!Object}
*/
- proto.bucketeer.event.domain.GoalRenamedEvent.prototype.toObject = function (
+ proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.toObject = function (
opt_includeInstance
) {
- return proto.bucketeer.event.domain.GoalRenamedEvent.toObject(
+ return proto.bucketeer.event.domain.GoalUpdatedEvent.toObject(
opt_includeInstance,
this
);
@@ -14781,18 +14953,23 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
- * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} msg The msg instance to transform.
+ * @param {!proto.bucketeer.event.domain.GoalUpdatedEvent} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
- proto.bucketeer.event.domain.GoalRenamedEvent.toObject = function (
+ proto.bucketeer.event.domain.GoalUpdatedEvent.toObject = function (
includeInstance,
msg
) {
var f,
obj = {
id: jspb.Message.getFieldWithDefault(msg, 1, ''),
- name: jspb.Message.getFieldWithDefault(msg, 2, '')
+ name:
+ (f = msg.getName()) &&
+ google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f),
+ description:
+ (f = msg.getDescription()) &&
+ google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f)
};
if (includeInstance) {
@@ -14805,14 +14982,14 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.bucketeer.event.domain.GoalRenamedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent}
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinary = function (
+proto.bucketeer.event.domain.GoalUpdatedEvent.deserializeBinary = function (
bytes
) {
var reader = new jspb.BinaryReader(bytes);
- var msg = new proto.bucketeer.event.domain.GoalRenamedEvent();
- return proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader(
+ var msg = new proto.bucketeer.event.domain.GoalUpdatedEvent();
+ return proto.bucketeer.event.domain.GoalUpdatedEvent.deserializeBinaryFromReader(
msg,
reader
);
@@ -14821,11 +14998,11 @@ proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinary = function (
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
- * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} msg The message object to deserialize into.
+ * @param {!proto.bucketeer.event.domain.GoalUpdatedEvent} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.bucketeer.event.domain.GoalRenamedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent}
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader =
+proto.bucketeer.event.domain.GoalUpdatedEvent.deserializeBinaryFromReader =
function (msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
@@ -14838,9 +15015,21 @@ proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader =
msg.setId(value);
break;
case 2:
- var value = /** @type {string} */ (reader.readString());
+ var value = new google_protobuf_wrappers_pb.StringValue();
+ reader.readMessage(
+ value,
+ google_protobuf_wrappers_pb.StringValue.deserializeBinaryFromReader
+ );
msg.setName(value);
break;
+ case 3:
+ var value = new google_protobuf_wrappers_pb.StringValue();
+ reader.readMessage(
+ value,
+ google_protobuf_wrappers_pb.StringValue.deserializeBinaryFromReader
+ );
+ msg.setDescription(value);
+ break;
default:
reader.skipField();
break;
@@ -14853,10 +15042,10 @@ proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader =
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.prototype.serializeBinary =
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.serializeBinary =
function () {
var writer = new jspb.BinaryWriter();
- proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter(
+ proto.bucketeer.event.domain.GoalUpdatedEvent.serializeBinaryToWriter(
this,
writer
);
@@ -14866,11 +15055,11 @@ proto.bucketeer.event.domain.GoalRenamedEvent.prototype.serializeBinary =
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
- * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} message
+ * @param {!proto.bucketeer.event.domain.GoalUpdatedEvent} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter =
+proto.bucketeer.event.domain.GoalUpdatedEvent.serializeBinaryToWriter =
function (message, writer) {
var f = undefined;
f = message.getId();
@@ -14878,8 +15067,20 @@ proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter =
writer.writeString(1, f);
}
f = message.getName();
- if (f.length > 0) {
- writer.writeString(2, f);
+ if (f != null) {
+ writer.writeMessage(
+ 2,
+ f,
+ google_protobuf_wrappers_pb.StringValue.serializeBinaryToWriter
+ );
+ }
+ f = message.getDescription();
+ if (f != null) {
+ writer.writeMessage(
+ 3,
+ f,
+ google_protobuf_wrappers_pb.StringValue.serializeBinaryToWriter
+ );
}
};
@@ -14887,38 +15088,103 @@ proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter =
* optional string id = 1;
* @return {string}
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.prototype.getId = function () {
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.getId = function () {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
};
/**
* @param {string} value
- * @return {!proto.bucketeer.event.domain.GoalRenamedEvent} returns this
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent} returns this
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.prototype.setId = function (
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.setId = function (
value
) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
- * optional string name = 2;
- * @return {string}
+ * optional google.protobuf.StringValue name = 2;
+ * @return {?proto.google.protobuf.StringValue}
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.prototype.getName = function () {
- return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ''));
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.getName = function () {
+ return /** @type{?proto.google.protobuf.StringValue} */ (
+ jspb.Message.getWrapperField(
+ this,
+ google_protobuf_wrappers_pb.StringValue,
+ 2
+ )
+ );
};
/**
- * @param {string} value
- * @return {!proto.bucketeer.event.domain.GoalRenamedEvent} returns this
+ * @param {?proto.google.protobuf.StringValue|undefined} value
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent} returns this
*/
-proto.bucketeer.event.domain.GoalRenamedEvent.prototype.setName = function (
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.setName = function (
value
) {
- return jspb.Message.setProto3StringField(this, 2, value);
+ return jspb.Message.setWrapperField(this, 2, value);
+};
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.clearName =
+ function () {
+ return this.setName(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.hasName = function () {
+ return jspb.Message.getField(this, 2) != null;
};
+/**
+ * optional google.protobuf.StringValue description = 3;
+ * @return {?proto.google.protobuf.StringValue}
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.getDescription =
+ function () {
+ return /** @type{?proto.google.protobuf.StringValue} */ (
+ jspb.Message.getWrapperField(
+ this,
+ google_protobuf_wrappers_pb.StringValue,
+ 3
+ )
+ );
+ };
+
+/**
+ * @param {?proto.google.protobuf.StringValue|undefined} value
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.setDescription =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 3, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.event.domain.GoalUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.clearDescription =
+ function () {
+ return this.setDescription(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.event.domain.GoalUpdatedEvent.prototype.hasDescription =
+ function () {
+ return jspb.Message.getField(this, 3) != null;
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -14932,31 +15198,32 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* http://goto/soy-param-migration
* @return {!Object}
*/
- proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.toObject =
- function (opt_includeInstance) {
- return proto.bucketeer.event.domain.GoalDescriptionChangedEvent.toObject(
- opt_includeInstance,
- this
- );
- };
+ proto.bucketeer.event.domain.GoalRenamedEvent.prototype.toObject = function (
+ opt_includeInstance
+ ) {
+ return proto.bucketeer.event.domain.GoalRenamedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
- * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} msg The msg instance to transform.
+ * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
- proto.bucketeer.event.domain.GoalDescriptionChangedEvent.toObject = function (
+ proto.bucketeer.event.domain.GoalRenamedEvent.toObject = function (
includeInstance,
msg
) {
var f,
obj = {
id: jspb.Message.getFieldWithDefault(msg, 1, ''),
- description: jspb.Message.getFieldWithDefault(msg, 2, '')
+ name: jspb.Message.getFieldWithDefault(msg, 2, '')
};
if (includeInstance) {
@@ -14969,26 +15236,27 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalRenamedEvent}
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinary =
- function (bytes) {
- var reader = new jspb.BinaryReader(bytes);
- var msg = new proto.bucketeer.event.domain.GoalDescriptionChangedEvent();
- return proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromReader(
- msg,
- reader
- );
- };
+proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinary = function (
+ bytes
+) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.GoalRenamedEvent();
+ return proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
- * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} msg The message object to deserialize into.
+ * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalRenamedEvent}
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromReader =
+proto.bucketeer.event.domain.GoalRenamedEvent.deserializeBinaryFromReader =
function (msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
@@ -15002,7 +15270,7 @@ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromRe
break;
case 2:
var value = /** @type {string} */ (reader.readString());
- msg.setDescription(value);
+ msg.setName(value);
break;
default:
reader.skipField();
@@ -15016,10 +15284,10 @@ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromRe
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.serializeBinary =
+proto.bucketeer.event.domain.GoalRenamedEvent.prototype.serializeBinary =
function () {
var writer = new jspb.BinaryWriter();
- proto.bucketeer.event.domain.GoalDescriptionChangedEvent.serializeBinaryToWriter(
+ proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter(
this,
writer
);
@@ -15029,18 +15297,18 @@ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.serializeBina
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
- * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} message
+ * @param {!proto.bucketeer.event.domain.GoalRenamedEvent} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.serializeBinaryToWriter =
+proto.bucketeer.event.domain.GoalRenamedEvent.serializeBinaryToWriter =
function (message, writer) {
var f = undefined;
f = message.getId();
if (f.length > 0) {
writer.writeString(1, f);
}
- f = message.getDescription();
+ f = message.getName();
if (f.length > 0) {
writer.writeString(2, f);
}
@@ -15050,41 +15318,37 @@ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.serializeBinaryToWriter
* optional string id = 1;
* @return {string}
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.getId =
- function () {
- return /** @type {string} */ (
- jspb.Message.getFieldWithDefault(this, 1, '')
- );
- };
+proto.bucketeer.event.domain.GoalRenamedEvent.prototype.getId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
+};
/**
* @param {string} value
- * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} returns this
+ * @return {!proto.bucketeer.event.domain.GoalRenamedEvent} returns this
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.setId =
- function (value) {
- return jspb.Message.setProto3StringField(this, 1, value);
- };
+proto.bucketeer.event.domain.GoalRenamedEvent.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
/**
- * optional string description = 2;
+ * optional string name = 2;
* @return {string}
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.getDescription =
- function () {
- return /** @type {string} */ (
- jspb.Message.getFieldWithDefault(this, 2, '')
- );
- };
+proto.bucketeer.event.domain.GoalRenamedEvent.prototype.getName = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ''));
+};
/**
* @param {string} value
- * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} returns this
+ * @return {!proto.bucketeer.event.domain.GoalRenamedEvent} returns this
*/
-proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.setDescription =
- function (value) {
- return jspb.Message.setProto3StringField(this, 2, value);
- };
+proto.bucketeer.event.domain.GoalRenamedEvent.prototype.setName = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
@@ -15099,31 +15363,31 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* http://goto/soy-param-migration
* @return {!Object}
*/
- proto.bucketeer.event.domain.GoalArchivedEvent.prototype.toObject = function (
- opt_includeInstance
- ) {
- return proto.bucketeer.event.domain.GoalArchivedEvent.toObject(
- opt_includeInstance,
- this
- );
- };
+ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.event.domain.GoalDescriptionChangedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
- * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} msg The msg instance to transform.
+ * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
- proto.bucketeer.event.domain.GoalArchivedEvent.toObject = function (
+ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.toObject = function (
includeInstance,
msg
) {
var f,
obj = {
- id: jspb.Message.getFieldWithDefault(msg, 1, '')
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ description: jspb.Message.getFieldWithDefault(msg, 2, '')
};
if (includeInstance) {
@@ -15136,27 +15400,26 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.bucketeer.event.domain.GoalArchivedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent}
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinary = function (
- bytes
-) {
- var reader = new jspb.BinaryReader(bytes);
- var msg = new proto.bucketeer.event.domain.GoalArchivedEvent();
- return proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader(
- msg,
- reader
- );
-};
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.GoalDescriptionChangedEvent();
+ return proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
- * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} msg The message object to deserialize into.
+ * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.bucketeer.event.domain.GoalArchivedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent}
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader =
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.deserializeBinaryFromReader =
function (msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
@@ -15168,6 +15431,10 @@ proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader =
var value = /** @type {string} */ (reader.readString());
msg.setId(value);
break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setDescription(value);
+ break;
default:
reader.skipField();
break;
@@ -15180,10 +15447,10 @@ proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader =
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.prototype.serializeBinary =
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.serializeBinary =
function () {
var writer = new jspb.BinaryWriter();
- proto.bucketeer.event.domain.GoalArchivedEvent.serializeBinaryToWriter(
+ proto.bucketeer.event.domain.GoalDescriptionChangedEvent.serializeBinaryToWriter(
this,
writer
);
@@ -15193,36 +15460,62 @@ proto.bucketeer.event.domain.GoalArchivedEvent.prototype.serializeBinary =
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
- * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} message
+ * @param {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.serializeBinaryToWriter =
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.serializeBinaryToWriter =
function (message, writer) {
var f = undefined;
f = message.getId();
if (f.length > 0) {
writer.writeString(1, f);
}
+ f = message.getDescription();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
};
/**
* optional string id = 1;
* @return {string}
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.prototype.getId = function () {
- return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
-};
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
/**
* @param {string} value
- * @return {!proto.bucketeer.event.domain.GoalArchivedEvent} returns this
+ * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} returns this
*/
-proto.bucketeer.event.domain.GoalArchivedEvent.prototype.setId = function (
- value
-) {
- return jspb.Message.setProto3StringField(this, 1, value);
-};
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.setId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string description = 2;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.getDescription =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.GoalDescriptionChangedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalDescriptionChangedEvent.prototype.setDescription =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
@@ -15237,10 +15530,10 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* http://goto/soy-param-migration
* @return {!Object}
*/
- proto.bucketeer.event.domain.GoalDeletedEvent.prototype.toObject = function (
+ proto.bucketeer.event.domain.GoalArchivedEvent.prototype.toObject = function (
opt_includeInstance
) {
- return proto.bucketeer.event.domain.GoalDeletedEvent.toObject(
+ return proto.bucketeer.event.domain.GoalArchivedEvent.toObject(
opt_includeInstance,
this
);
@@ -15251,11 +15544,11 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
- * @param {!proto.bucketeer.event.domain.GoalDeletedEvent} msg The msg instance to transform.
+ * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
- proto.bucketeer.event.domain.GoalDeletedEvent.toObject = function (
+ proto.bucketeer.event.domain.GoalArchivedEvent.toObject = function (
includeInstance,
msg
) {
@@ -15274,14 +15567,14 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.bucketeer.event.domain.GoalDeletedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalArchivedEvent}
*/
-proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinary = function (
+proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinary = function (
bytes
) {
var reader = new jspb.BinaryReader(bytes);
- var msg = new proto.bucketeer.event.domain.GoalDeletedEvent();
- return proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinaryFromReader(
+ var msg = new proto.bucketeer.event.domain.GoalArchivedEvent();
+ return proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader(
msg,
reader
);
@@ -15290,11 +15583,149 @@ proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinary = function (
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
- * @param {!proto.bucketeer.event.domain.GoalDeletedEvent} msg The message object to deserialize into.
+ * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.bucketeer.event.domain.GoalDeletedEvent}
+ * @return {!proto.bucketeer.event.domain.GoalArchivedEvent}
*/
-proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinaryFromReader =
+proto.bucketeer.event.domain.GoalArchivedEvent.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.event.domain.GoalArchivedEvent.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.event.domain.GoalArchivedEvent.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.event.domain.GoalArchivedEvent} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.event.domain.GoalArchivedEvent.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.GoalArchivedEvent.prototype.getId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.GoalArchivedEvent} returns this
+ */
+proto.bucketeer.event.domain.GoalArchivedEvent.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.event.domain.GoalDeletedEvent.prototype.toObject = function (
+ opt_includeInstance
+ ) {
+ return proto.bucketeer.event.domain.GoalDeletedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.event.domain.GoalDeletedEvent} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.event.domain.GoalDeletedEvent.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.event.domain.GoalDeletedEvent}
+ */
+proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinary = function (
+ bytes
+) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.GoalDeletedEvent();
+ return proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.event.domain.GoalDeletedEvent} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.event.domain.GoalDeletedEvent}
+ */
+proto.bucketeer.event.domain.GoalDeletedEvent.deserializeBinaryFromReader =
function (msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
@@ -39599,4 +40030,1167 @@ proto.bucketeer.event.domain.TagDeletedEvent.prototype.setEnvironmentId =
return jspb.Message.setProto3StringField(this, 6, value);
};
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.repeatedFields_ = [7];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.event.domain.CodeReferenceCreatedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ featureId: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ filePath: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ lineNumber: jspb.Message.getFieldWithDefault(msg, 4, 0),
+ codeSnippet: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ contentHash: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ aliasesList:
+ (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f,
+ repositoryName: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ repositoryOwner: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ repositoryType: jspb.Message.getFieldWithDefault(msg, 10, 0),
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 11, ''),
+ commitHash: jspb.Message.getFieldWithDefault(msg, 12, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 13, ''),
+ createdAt: jspb.Message.getFieldWithDefault(msg, 14, 0),
+ updatedAt: jspb.Message.getFieldWithDefault(msg, 15, 0)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.CodeReferenceCreatedEvent();
+ return proto.bucketeer.event.domain.CodeReferenceCreatedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFeatureId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFilePath(value);
+ break;
+ case 4:
+ var value = /** @type {number} */ (reader.readInt32());
+ msg.setLineNumber(value);
+ break;
+ case 5:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCodeSnippet(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setContentHash(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addAliases(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryName(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryOwner(value);
+ break;
+ case 10:
+ var value =
+ /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ reader.readEnum()
+ );
+ msg.setRepositoryType(value);
+ break;
+ case 11:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 12:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitHash(value);
+ break;
+ case 13:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 14:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setCreatedAt(value);
+ break;
+ case 15:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setUpdatedAt(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.event.domain.CodeReferenceCreatedEvent.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getFeatureId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getFilePath();
+ if (f.length > 0) {
+ writer.writeString(3, f);
+ }
+ f = message.getLineNumber();
+ if (f !== 0) {
+ writer.writeInt32(4, f);
+ }
+ f = message.getCodeSnippet();
+ if (f.length > 0) {
+ writer.writeString(5, f);
+ }
+ f = message.getContentHash();
+ if (f.length > 0) {
+ writer.writeString(6, f);
+ }
+ f = message.getAliasesList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(7, f);
+ }
+ f = message.getRepositoryName();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getRepositoryOwner();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getRepositoryType();
+ if (f !== 0.0) {
+ writer.writeEnum(10, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(11, f);
+ }
+ f = message.getCommitHash();
+ if (f.length > 0) {
+ writer.writeString(12, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(13, f);
+ }
+ f = message.getCreatedAt();
+ if (f !== 0) {
+ writer.writeInt64(14, f);
+ }
+ f = message.getUpdatedAt();
+ if (f !== 0) {
+ writer.writeInt64(15, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string feature_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getFeatureId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setFeatureId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional string file_path = 3;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getFilePath =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 3, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setFilePath =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 3, value);
+ };
+
+/**
+ * optional int32 line_number = 4;
+ * @return {number}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getLineNumber =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setLineNumber =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 4, value);
+ };
+
+/**
+ * optional string code_snippet = 5;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getCodeSnippet =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 5, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setCodeSnippet =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 5, value);
+ };
+
+/**
+ * optional string content_hash = 6;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getContentHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 6, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setContentHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 6, value);
+ };
+
+/**
+ * repeated string aliases = 7;
+ * @return {!Array}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getAliasesList =
+ function () {
+ return /** @type {!Array} */ (
+ jspb.Message.getRepeatedField(this, 7)
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setAliasesList =
+ function (value) {
+ return jspb.Message.setField(this, 7, value || []);
+ };
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.addAliases =
+ function (value, opt_index) {
+ return jspb.Message.addToRepeatedField(this, 7, value, opt_index);
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.clearAliasesList =
+ function () {
+ return this.setAliasesList([]);
+ };
+
+/**
+ * optional string repository_name = 8;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getRepositoryName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setRepositoryName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+ };
+
+/**
+ * optional string repository_owner = 9;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getRepositoryOwner =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setRepositoryOwner =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+ };
+
+/**
+ * optional bucketeer.coderef.CodeReference.RepositoryType repository_type = 10;
+ * @return {!proto.bucketeer.coderef.CodeReference.RepositoryType}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getRepositoryType =
+ function () {
+ return /** @type {!proto.bucketeer.coderef.CodeReference.RepositoryType} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.coderef.CodeReference.RepositoryType} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setRepositoryType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 10, value);
+ };
+
+/**
+ * optional string repository_branch = 11;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 11, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setRepositoryBranch =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 11, value);
+ };
+
+/**
+ * optional string commit_hash = 12;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getCommitHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 12, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setCommitHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 12, value);
+ };
+
+/**
+ * optional string environment_id = 13;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 13, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 13, value);
+ };
+
+/**
+ * optional int64 created_at = 14;
+ * @return {number}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getCreatedAt =
+ function () {
+ return /** @type {number} */ (
+ jspb.Message.getFieldWithDefault(this, 14, 0)
+ );
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setCreatedAt =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 14, value);
+ };
+
+/**
+ * optional int64 updated_at = 15;
+ * @return {number}
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.getUpdatedAt =
+ function () {
+ return /** @type {number} */ (
+ jspb.Message.getFieldWithDefault(this, 15, 0)
+ );
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceCreatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceCreatedEvent.prototype.setUpdatedAt =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 15, value);
+ };
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.repeatedFields_ = [6];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ filePath: jspb.Message.getFieldWithDefault(msg, 2, ''),
+ lineNumber: jspb.Message.getFieldWithDefault(msg, 3, 0),
+ codeSnippet: jspb.Message.getFieldWithDefault(msg, 4, ''),
+ contentHash: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ aliasesList:
+ (f = jspb.Message.getRepeatedField(msg, 6)) == null ? undefined : f,
+ repositoryBranch: jspb.Message.getFieldWithDefault(msg, 7, ''),
+ commitHash: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ updatedAt: jspb.Message.getFieldWithDefault(msg, 10, 0)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.CodeReferenceUpdatedEvent();
+ return proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFilePath(value);
+ break;
+ case 3:
+ var value = /** @type {number} */ (reader.readInt32());
+ msg.setLineNumber(value);
+ break;
+ case 4:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCodeSnippet(value);
+ break;
+ case 5:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setContentHash(value);
+ break;
+ case 6:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addAliases(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setRepositoryBranch(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitHash(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 10:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setUpdatedAt(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getFilePath();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ f = message.getLineNumber();
+ if (f !== 0) {
+ writer.writeInt32(3, f);
+ }
+ f = message.getCodeSnippet();
+ if (f.length > 0) {
+ writer.writeString(4, f);
+ }
+ f = message.getContentHash();
+ if (f.length > 0) {
+ writer.writeString(5, f);
+ }
+ f = message.getAliasesList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(6, f);
+ }
+ f = message.getRepositoryBranch();
+ if (f.length > 0) {
+ writer.writeString(7, f);
+ }
+ f = message.getCommitHash();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getUpdatedAt();
+ if (f !== 0) {
+ writer.writeInt64(10, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string file_path = 2;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getFilePath =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setFilePath =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
+/**
+ * optional int32 line_number = 3;
+ * @return {number}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getLineNumber =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setLineNumber =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 3, value);
+ };
+
+/**
+ * optional string code_snippet = 4;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getCodeSnippet =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 4, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setCodeSnippet =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 4, value);
+ };
+
+/**
+ * optional string content_hash = 5;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getContentHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 5, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setContentHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 5, value);
+ };
+
+/**
+ * repeated string aliases = 6;
+ * @return {!Array}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getAliasesList =
+ function () {
+ return /** @type {!Array} */ (
+ jspb.Message.getRepeatedField(this, 6)
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setAliasesList =
+ function (value) {
+ return jspb.Message.setField(this, 6, value || []);
+ };
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.addAliases =
+ function (value, opt_index) {
+ return jspb.Message.addToRepeatedField(this, 6, value, opt_index);
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.clearAliasesList =
+ function () {
+ return this.setAliasesList([]);
+ };
+
+/**
+ * optional string repository_branch = 7;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getRepositoryBranch =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 7, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setRepositoryBranch =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 7, value);
+ };
+
+/**
+ * optional string commit_hash = 8;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getCommitHash =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setCommitHash =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+ };
+
+/**
+ * optional string environment_id = 9;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+ };
+
+/**
+ * optional int64 updated_at = 10;
+ * @return {number}
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.getUpdatedAt =
+ function () {
+ return /** @type {number} */ (
+ jspb.Message.getFieldWithDefault(this, 10, 0)
+ );
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceUpdatedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceUpdatedEvent.prototype.setUpdatedAt =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 10, value);
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.event.domain.CodeReferenceDeletedEvent.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.event.domain.CodeReferenceDeletedEvent.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ environmentId: jspb.Message.getFieldWithDefault(msg, 2, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.event.domain.CodeReferenceDeletedEvent();
+ return proto.bucketeer.event.domain.CodeReferenceDeletedEvent.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent}
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.event.domain.CodeReferenceDeletedEvent.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.setId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+ };
+
+/**
+ * optional string environment_id = 2;
+ * @return {string}
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.getEnvironmentId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.event.domain.CodeReferenceDeletedEvent} returns this
+ */
+proto.bucketeer.event.domain.CodeReferenceDeletedEvent.prototype.setEnvironmentId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
goog.object.extend(exports, proto.bucketeer.event.domain);
diff --git a/ui/web-v2/src/proto/experiment/command_pb.d.ts b/ui/web-v2/src/proto/experiment/command_pb.d.ts
index 4d30d11847..913bcfbd29 100644
--- a/ui/web-v2/src/proto/experiment/command_pb.d.ts
+++ b/ui/web-v2/src/proto/experiment/command_pb.d.ts
@@ -2,6 +2,7 @@
// file: proto/experiment/command.proto
import * as jspb from 'google-protobuf';
+import * as proto_experiment_goal_pb from '../../proto/experiment/goal_pb';
export class CreateGoalCommand extends jspb.Message {
getId(): string;
@@ -13,6 +14,11 @@ export class CreateGoalCommand extends jspb.Message {
getDescription(): string;
setDescription(value: string): void;
+ getConnectionType(): proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
+ setConnectionType(
+ value: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap]
+ ): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateGoalCommand.AsObject;
static toObject(
@@ -39,6 +45,7 @@ export namespace CreateGoalCommand {
id: string;
name: string;
description: string;
+ connectionType: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
};
}
diff --git a/ui/web-v2/src/proto/experiment/command_pb.js b/ui/web-v2/src/proto/experiment/command_pb.js
index 22df865965..4dd8673a42 100644
--- a/ui/web-v2/src/proto/experiment/command_pb.js
+++ b/ui/web-v2/src/proto/experiment/command_pb.js
@@ -23,6 +23,8 @@ var global =
}.call(null) ||
Function('return this')();
+var proto_experiment_goal_pb = require('../../proto/experiment/goal_pb.js');
+goog.object.extend(proto, proto_experiment_goal_pb);
goog.exportSymbol(
'proto.bucketeer.experiment.ArchiveExperimentCommand',
null,
@@ -453,7 +455,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
obj = {
id: jspb.Message.getFieldWithDefault(msg, 1, ''),
name: jspb.Message.getFieldWithDefault(msg, 2, ''),
- description: jspb.Message.getFieldWithDefault(msg, 3, '')
+ description: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ connectionType: jspb.Message.getFieldWithDefault(msg, 4, 0)
};
if (includeInstance) {
@@ -506,6 +509,13 @@ proto.bucketeer.experiment.CreateGoalCommand.deserializeBinaryFromReader =
var value = /** @type {string} */ (reader.readString());
msg.setDescription(value);
break;
+ case 4:
+ var value =
+ /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ reader.readEnum()
+ );
+ msg.setConnectionType(value);
+ break;
default:
reader.skipField();
break;
@@ -550,6 +560,10 @@ proto.bucketeer.experiment.CreateGoalCommand.serializeBinaryToWriter =
if (f.length > 0) {
writer.writeString(3, f);
}
+ f = message.getConnectionType();
+ if (f !== 0.0) {
+ writer.writeEnum(4, f);
+ }
};
/**
@@ -608,6 +622,26 @@ proto.bucketeer.experiment.CreateGoalCommand.prototype.setDescription =
return jspb.Message.setProto3StringField(this, 3, value);
};
+/**
+ * optional Goal.ConnectionType connection_type = 4;
+ * @return {!proto.bucketeer.experiment.Goal.ConnectionType}
+ */
+proto.bucketeer.experiment.CreateGoalCommand.prototype.getConnectionType =
+ function () {
+ return /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ jspb.Message.getFieldWithDefault(this, 4, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.experiment.Goal.ConnectionType} value
+ * @return {!proto.bucketeer.experiment.CreateGoalCommand} returns this
+ */
+proto.bucketeer.experiment.CreateGoalCommand.prototype.setConnectionType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 4, value);
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
diff --git a/ui/web-v2/src/proto/experiment/experiment_pb.d.ts b/ui/web-v2/src/proto/experiment/experiment_pb.d.ts
index da1aeaf233..55b9e3f8e4 100644
--- a/ui/web-v2/src/proto/experiment/experiment_pb.d.ts
+++ b/ui/web-v2/src/proto/experiment/experiment_pb.d.ts
@@ -69,6 +69,14 @@ export class Experiment extends jspb.Message {
getArchived(): boolean;
setArchived(value: boolean): void;
+ clearGoalsList(): void;
+ getGoalsList(): Array;
+ setGoalsList(value: Array): void;
+ addGoals(
+ value?: Experiment.GoalReference,
+ index?: number
+ ): Experiment.GoalReference;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Experiment.AsObject;
static toObject(
@@ -111,8 +119,44 @@ export namespace Experiment {
status: Experiment.StatusMap[keyof Experiment.StatusMap];
maintainer: string;
archived: boolean;
+ goalsList: Array;
};
+ export class GoalReference extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getName(): string;
+ setName(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GoalReference.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: GoalReference
+ ): GoalReference.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: GoalReference,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): GoalReference;
+ static deserializeBinaryFromReader(
+ message: GoalReference,
+ reader: jspb.BinaryReader
+ ): GoalReference;
+ }
+
+ export namespace GoalReference {
+ export type AsObject = {
+ id: string;
+ name: string;
+ };
+ }
+
export interface StatusMap {
WAITING: 0;
RUNNING: 1;
diff --git a/ui/web-v2/src/proto/experiment/experiment_pb.js b/ui/web-v2/src/proto/experiment/experiment_pb.js
index 57d5cf2e88..3ae560c717 100644
--- a/ui/web-v2/src/proto/experiment/experiment_pb.js
+++ b/ui/web-v2/src/proto/experiment/experiment_pb.js
@@ -26,6 +26,11 @@ var global =
var proto_feature_variation_pb = require('../../proto/feature/variation_pb.js');
goog.object.extend(proto, proto_feature_variation_pb);
goog.exportSymbol('proto.bucketeer.experiment.Experiment', null, global);
+goog.exportSymbol(
+ 'proto.bucketeer.experiment.Experiment.GoalReference',
+ null,
+ global
+);
goog.exportSymbol('proto.bucketeer.experiment.Experiment.Status', null, global);
goog.exportSymbol('proto.bucketeer.experiment.Experiments', null, global);
/**
@@ -57,6 +62,31 @@ if (goog.DEBUG && !COMPILED) {
proto.bucketeer.experiment.Experiment.displayName =
'proto.bucketeer.experiment.Experiment';
}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.experiment.Experiment.GoalReference = function (opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(
+ proto.bucketeer.experiment.Experiment.GoalReference,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.experiment.Experiment.GoalReference.displayName =
+ 'proto.bucketeer.experiment.Experiment.GoalReference';
+}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@@ -92,7 +122,7 @@ if (goog.DEBUG && !COMPILED) {
* @private {!Array}
* @const
*/
-proto.bucketeer.experiment.Experiment.repeatedFields_ = [5, 13];
+proto.bucketeer.experiment.Experiment.repeatedFields_ = [5, 13, 21];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
@@ -154,7 +184,12 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
baseVariationId: jspb.Message.getFieldWithDefault(msg, 16, ''),
status: jspb.Message.getFieldWithDefault(msg, 18, 0),
maintainer: jspb.Message.getFieldWithDefault(msg, 19, ''),
- archived: jspb.Message.getBooleanFieldWithDefault(msg, 20, false)
+ archived: jspb.Message.getBooleanFieldWithDefault(msg, 20, false),
+ goalsList: jspb.Message.toObjectList(
+ msg.getGoalsList(),
+ proto.bucketeer.experiment.Experiment.GoalReference.toObject,
+ includeInstance
+ )
};
if (includeInstance) {
@@ -278,6 +313,15 @@ proto.bucketeer.experiment.Experiment.deserializeBinaryFromReader = function (
var value = /** @type {boolean} */ (reader.readBool());
msg.setArchived(value);
break;
+ case 21:
+ var value = new proto.bucketeer.experiment.Experiment.GoalReference();
+ reader.readMessage(
+ value,
+ proto.bucketeer.experiment.Experiment.GoalReference
+ .deserializeBinaryFromReader
+ );
+ msg.addGoals(value);
+ break;
default:
reader.skipField();
break;
@@ -388,6 +432,15 @@ proto.bucketeer.experiment.Experiment.serializeBinaryToWriter = function (
if (f) {
writer.writeBool(20, f);
}
+ f = message.getGoalsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 21,
+ f,
+ proto.bucketeer.experiment.Experiment.GoalReference
+ .serializeBinaryToWriter
+ );
+ }
};
/**
@@ -400,6 +453,174 @@ proto.bucketeer.experiment.Experiment.Status = {
FORCE_STOPPED: 3
};
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.experiment.Experiment.GoalReference.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.experiment.Experiment.GoalReference.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.experiment.Experiment.GoalReference} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.experiment.Experiment.GoalReference.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ name: jspb.Message.getFieldWithDefault(msg, 2, '')
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.experiment.Experiment.GoalReference}
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.experiment.Experiment.GoalReference();
+ return proto.bucketeer.experiment.Experiment.GoalReference.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.experiment.Experiment.GoalReference} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.experiment.Experiment.GoalReference}
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.experiment.Experiment.GoalReference.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.experiment.Experiment.GoalReference} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(2, f);
+ }
+ };
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.prototype.getId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 1, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.Experiment.GoalReference} returns this
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.prototype.setId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.prototype.getName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 2, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.Experiment.GoalReference} returns this
+ */
+proto.bucketeer.experiment.Experiment.GoalReference.prototype.setName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 2, value);
+ };
+
/**
* optional string id = 1;
* @return {string}
@@ -792,6 +1013,56 @@ proto.bucketeer.experiment.Experiment.prototype.setArchived = function (value) {
return jspb.Message.setProto3BooleanField(this, 20, value);
};
+/**
+ * repeated GoalReference goals = 21;
+ * @return {!Array}
+ */
+proto.bucketeer.experiment.Experiment.prototype.getGoalsList = function () {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(
+ this,
+ proto.bucketeer.experiment.Experiment.GoalReference,
+ 21
+ )
+ );
+};
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.experiment.Experiment} returns this
+ */
+proto.bucketeer.experiment.Experiment.prototype.setGoalsList = function (
+ value
+) {
+ return jspb.Message.setRepeatedWrapperField(this, 21, value);
+};
+
+/**
+ * @param {!proto.bucketeer.experiment.Experiment.GoalReference=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.experiment.Experiment.GoalReference}
+ */
+proto.bucketeer.experiment.Experiment.prototype.addGoals = function (
+ opt_value,
+ opt_index
+) {
+ return jspb.Message.addToRepeatedWrapperField(
+ this,
+ 21,
+ opt_value,
+ proto.bucketeer.experiment.Experiment.GoalReference,
+ opt_index
+ );
+};
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.experiment.Experiment} returns this
+ */
+proto.bucketeer.experiment.Experiment.prototype.clearGoalsList = function () {
+ return this.setGoalsList([]);
+};
+
/**
* List of repeated fields within this message type.
* @private {!Array}
diff --git a/ui/web-v2/src/proto/experiment/goal_pb.d.ts b/ui/web-v2/src/proto/experiment/goal_pb.d.ts
index 222e3f5769..9ea7f0ed30 100644
--- a/ui/web-v2/src/proto/experiment/goal_pb.d.ts
+++ b/ui/web-v2/src/proto/experiment/goal_pb.d.ts
@@ -2,6 +2,8 @@
// file: proto/experiment/goal.proto
import * as jspb from 'google-protobuf';
+import * as proto_experiment_experiment_pb from '../../proto/experiment/experiment_pb';
+import * as proto_autoops_auto_ops_rule_pb from '../../proto/autoops/auto_ops_rule_pb';
export class Goal extends jspb.Message {
getId(): string;
@@ -28,6 +30,31 @@ export class Goal extends jspb.Message {
getArchived(): boolean;
setArchived(value: boolean): void;
+ getConnectionType(): Goal.ConnectionTypeMap[keyof Goal.ConnectionTypeMap];
+ setConnectionType(
+ value: Goal.ConnectionTypeMap[keyof Goal.ConnectionTypeMap]
+ ): void;
+
+ clearExperimentsList(): void;
+ getExperimentsList(): Array;
+ setExperimentsList(
+ value: Array
+ ): void;
+ addExperiments(
+ value?: proto_experiment_experiment_pb.Experiment,
+ index?: number
+ ): proto_experiment_experiment_pb.Experiment;
+
+ clearAutoOpsRulesList(): void;
+ getAutoOpsRulesList(): Array;
+ setAutoOpsRulesList(
+ value: Array
+ ): void;
+ addAutoOpsRules(
+ value?: proto_autoops_auto_ops_rule_pb.AutoOpsRule,
+ index?: number
+ ): proto_autoops_auto_ops_rule_pb.AutoOpsRule;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Goal.AsObject;
static toObject(includeInstance: boolean, msg: Goal): Goal.AsObject;
@@ -56,5 +83,16 @@ export namespace Goal {
updatedAt: number;
isInUseStatus: boolean;
archived: boolean;
+ connectionType: Goal.ConnectionTypeMap[keyof Goal.ConnectionTypeMap];
+ experimentsList: Array;
+ autoOpsRulesList: Array;
};
+
+ export interface ConnectionTypeMap {
+ UNKNOWN: 0;
+ EXPERIMENT: 1;
+ OPERATION: 2;
+ }
+
+ export const ConnectionType: ConnectionTypeMap;
}
diff --git a/ui/web-v2/src/proto/experiment/goal_pb.js b/ui/web-v2/src/proto/experiment/goal_pb.js
index 40e62f98b1..c806053f1f 100644
--- a/ui/web-v2/src/proto/experiment/goal_pb.js
+++ b/ui/web-v2/src/proto/experiment/goal_pb.js
@@ -23,7 +23,16 @@ var global =
}.call(null) ||
Function('return this')();
+var proto_experiment_experiment_pb = require('../../proto/experiment/experiment_pb.js');
+goog.object.extend(proto, proto_experiment_experiment_pb);
+var proto_autoops_auto_ops_rule_pb = require('../../proto/autoops/auto_ops_rule_pb.js');
+goog.object.extend(proto, proto_autoops_auto_ops_rule_pb);
goog.exportSymbol('proto.bucketeer.experiment.Goal', null, global);
+goog.exportSymbol(
+ 'proto.bucketeer.experiment.Goal.ConnectionType',
+ null,
+ global
+);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@@ -35,7 +44,14 @@ goog.exportSymbol('proto.bucketeer.experiment.Goal', null, global);
* @constructor
*/
proto.bucketeer.experiment.Goal = function (opt_data) {
- jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.experiment.Goal.repeatedFields_,
+ null
+ );
};
goog.inherits(proto.bucketeer.experiment.Goal, jspb.Message);
if (goog.DEBUG && !COMPILED) {
@@ -47,6 +63,13 @@ if (goog.DEBUG && !COMPILED) {
'proto.bucketeer.experiment.Goal';
}
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.experiment.Goal.repeatedFields_ = [10, 11];
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -85,7 +108,18 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
createdAt: jspb.Message.getFieldWithDefault(msg, 5, 0),
updatedAt: jspb.Message.getFieldWithDefault(msg, 6, 0),
isInUseStatus: jspb.Message.getBooleanFieldWithDefault(msg, 7, false),
- archived: jspb.Message.getBooleanFieldWithDefault(msg, 8, false)
+ archived: jspb.Message.getBooleanFieldWithDefault(msg, 8, false),
+ connectionType: jspb.Message.getFieldWithDefault(msg, 9, 0),
+ experimentsList: jspb.Message.toObjectList(
+ msg.getExperimentsList(),
+ proto_experiment_experiment_pb.Experiment.toObject,
+ includeInstance
+ ),
+ autoOpsRulesList: jspb.Message.toObjectList(
+ msg.getAutoOpsRulesList(),
+ proto_autoops_auto_ops_rule_pb.AutoOpsRule.toObject,
+ includeInstance
+ )
};
if (includeInstance) {
@@ -158,6 +192,29 @@ proto.bucketeer.experiment.Goal.deserializeBinaryFromReader = function (
var value = /** @type {boolean} */ (reader.readBool());
msg.setArchived(value);
break;
+ case 9:
+ var value =
+ /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ reader.readEnum()
+ );
+ msg.setConnectionType(value);
+ break;
+ case 10:
+ var value = new proto_experiment_experiment_pb.Experiment();
+ reader.readMessage(
+ value,
+ proto_experiment_experiment_pb.Experiment.deserializeBinaryFromReader
+ );
+ msg.addExperiments(value);
+ break;
+ case 11:
+ var value = new proto_autoops_auto_ops_rule_pb.AutoOpsRule();
+ reader.readMessage(
+ value,
+ proto_autoops_auto_ops_rule_pb.AutoOpsRule.deserializeBinaryFromReader
+ );
+ msg.addAutoOpsRules(value);
+ break;
default:
reader.skipField();
break;
@@ -220,6 +277,35 @@ proto.bucketeer.experiment.Goal.serializeBinaryToWriter = function (
if (f) {
writer.writeBool(8, f);
}
+ f = message.getConnectionType();
+ if (f !== 0.0) {
+ writer.writeEnum(9, f);
+ }
+ f = message.getExperimentsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 10,
+ f,
+ proto_experiment_experiment_pb.Experiment.serializeBinaryToWriter
+ );
+ }
+ f = message.getAutoOpsRulesList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 11,
+ f,
+ proto_autoops_auto_ops_rule_pb.AutoOpsRule.serializeBinaryToWriter
+ );
+ }
+};
+
+/**
+ * @enum {number}
+ */
+proto.bucketeer.experiment.Goal.ConnectionType = {
+ UNKNOWN: 0,
+ EXPERIMENT: 1,
+ OPERATION: 2
};
/**
@@ -356,4 +442,122 @@ proto.bucketeer.experiment.Goal.prototype.setArchived = function (value) {
return jspb.Message.setProto3BooleanField(this, 8, value);
};
+/**
+ * optional ConnectionType connection_type = 9;
+ * @return {!proto.bucketeer.experiment.Goal.ConnectionType}
+ */
+proto.bucketeer.experiment.Goal.prototype.getConnectionType = function () {
+ return /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ jspb.Message.getFieldWithDefault(this, 9, 0)
+ );
+};
+
+/**
+ * @param {!proto.bucketeer.experiment.Goal.ConnectionType} value
+ * @return {!proto.bucketeer.experiment.Goal} returns this
+ */
+proto.bucketeer.experiment.Goal.prototype.setConnectionType = function (value) {
+ return jspb.Message.setProto3EnumField(this, 9, value);
+};
+
+/**
+ * repeated Experiment experiments = 10;
+ * @return {!Array}
+ */
+proto.bucketeer.experiment.Goal.prototype.getExperimentsList = function () {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(
+ this,
+ proto_experiment_experiment_pb.Experiment,
+ 10
+ )
+ );
+};
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.experiment.Goal} returns this
+ */
+proto.bucketeer.experiment.Goal.prototype.setExperimentsList = function (
+ value
+) {
+ return jspb.Message.setRepeatedWrapperField(this, 10, value);
+};
+
+/**
+ * @param {!proto.bucketeer.experiment.Experiment=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.experiment.Experiment}
+ */
+proto.bucketeer.experiment.Goal.prototype.addExperiments = function (
+ opt_value,
+ opt_index
+) {
+ return jspb.Message.addToRepeatedWrapperField(
+ this,
+ 10,
+ opt_value,
+ proto.bucketeer.experiment.Experiment,
+ opt_index
+ );
+};
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.experiment.Goal} returns this
+ */
+proto.bucketeer.experiment.Goal.prototype.clearExperimentsList = function () {
+ return this.setExperimentsList([]);
+};
+
+/**
+ * repeated bucketeer.autoops.AutoOpsRule auto_ops_rules = 11;
+ * @return {!Array}
+ */
+proto.bucketeer.experiment.Goal.prototype.getAutoOpsRulesList = function () {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(
+ this,
+ proto_autoops_auto_ops_rule_pb.AutoOpsRule,
+ 11
+ )
+ );
+};
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.experiment.Goal} returns this
+ */
+proto.bucketeer.experiment.Goal.prototype.setAutoOpsRulesList = function (
+ value
+) {
+ return jspb.Message.setRepeatedWrapperField(this, 11, value);
+};
+
+/**
+ * @param {!proto.bucketeer.autoops.AutoOpsRule=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.autoops.AutoOpsRule}
+ */
+proto.bucketeer.experiment.Goal.prototype.addAutoOpsRules = function (
+ opt_value,
+ opt_index
+) {
+ return jspb.Message.addToRepeatedWrapperField(
+ this,
+ 11,
+ opt_value,
+ proto.bucketeer.autoops.AutoOpsRule,
+ opt_index
+ );
+};
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.experiment.Goal} returns this
+ */
+proto.bucketeer.experiment.Goal.prototype.clearAutoOpsRulesList = function () {
+ return this.setAutoOpsRulesList([]);
+};
+
goog.object.extend(exports, proto.bucketeer.experiment);
diff --git a/ui/web-v2/src/proto/experiment/service_pb.d.ts b/ui/web-v2/src/proto/experiment/service_pb.d.ts
index 9751e13e1c..8315f103d8 100644
--- a/ui/web-v2/src/proto/experiment/service_pb.d.ts
+++ b/ui/web-v2/src/proto/experiment/service_pb.d.ts
@@ -149,6 +149,7 @@ export namespace ListGoalsRequest {
NAME: 1;
CREATED_AT: 2;
UPDATED_AT: 3;
+ CONNECTION_TYPE: 4;
}
export const OrderBy: OrderByMap;
@@ -223,6 +224,11 @@ export class CreateGoalRequest extends jspb.Message {
getDescription(): string;
setDescription(value: string): void;
+ getConnectionType(): proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
+ setConnectionType(
+ value: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap]
+ ): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateGoalRequest.AsObject;
static toObject(
@@ -251,6 +257,7 @@ export namespace CreateGoalRequest {
id: string;
name: string;
description: string;
+ connectionType: proto_experiment_goal_pb.Goal.ConnectionTypeMap[keyof proto_experiment_goal_pb.Goal.ConnectionTypeMap];
};
}
@@ -442,6 +449,21 @@ export class UpdateGoalRequest extends jspb.Message {
getEnvironmentId(): string;
setEnvironmentId(value: string): void;
+ hasName(): boolean;
+ clearName(): void;
+ getName(): google_protobuf_wrappers_pb.StringValue | undefined;
+ setName(value?: google_protobuf_wrappers_pb.StringValue): void;
+
+ hasDescription(): boolean;
+ clearDescription(): void;
+ getDescription(): google_protobuf_wrappers_pb.StringValue | undefined;
+ setDescription(value?: google_protobuf_wrappers_pb.StringValue): void;
+
+ hasArchived(): boolean;
+ clearArchived(): void;
+ getArchived(): google_protobuf_wrappers_pb.BoolValue | undefined;
+ setArchived(value?: google_protobuf_wrappers_pb.BoolValue): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpdateGoalRequest.AsObject;
static toObject(
@@ -469,10 +491,18 @@ export namespace UpdateGoalRequest {
renameCommand?: proto_experiment_command_pb.RenameGoalCommand.AsObject;
changeDescriptionCommand?: proto_experiment_command_pb.ChangeDescriptionGoalCommand.AsObject;
environmentId: string;
+ name?: google_protobuf_wrappers_pb.StringValue.AsObject;
+ description?: google_protobuf_wrappers_pb.StringValue.AsObject;
+ archived?: google_protobuf_wrappers_pb.BoolValue.AsObject;
};
}
export class UpdateGoalResponse extends jspb.Message {
+ hasGoal(): boolean;
+ clearGoal(): void;
+ getGoal(): proto_experiment_goal_pb.Goal | undefined;
+ setGoal(value?: proto_experiment_goal_pb.Goal): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UpdateGoalResponse.AsObject;
static toObject(
@@ -495,7 +525,9 @@ export class UpdateGoalResponse extends jspb.Message {
}
export namespace UpdateGoalResponse {
- export type AsObject = {};
+ export type AsObject = {
+ goal?: proto_experiment_goal_pb.Goal.AsObject;
+ };
}
export class GetExperimentRequest extends jspb.Message {
@@ -705,6 +737,11 @@ export class ListExperimentsResponse extends jspb.Message {
getTotalCount(): number;
setTotalCount(value: number): void;
+ hasSummary(): boolean;
+ clearSummary(): void;
+ getSummary(): ListExperimentsResponse.Summary | undefined;
+ setSummary(value?: ListExperimentsResponse.Summary): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListExperimentsResponse.AsObject;
static toObject(
@@ -731,7 +768,44 @@ export namespace ListExperimentsResponse {
experimentsList: Array;
cursor: string;
totalCount: number;
+ summary?: ListExperimentsResponse.Summary.AsObject;
};
+
+ export class Summary extends jspb.Message {
+ getTotalWaitingCount(): number;
+ setTotalWaitingCount(value: number): void;
+
+ getTotalRunningCount(): number;
+ setTotalRunningCount(value: number): void;
+
+ getTotalStoppedCount(): number;
+ setTotalStoppedCount(value: number): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): Summary.AsObject;
+ static toObject(includeInstance: boolean, msg: Summary): Summary.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: Summary,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): Summary;
+ static deserializeBinaryFromReader(
+ message: Summary,
+ reader: jspb.BinaryReader
+ ): Summary;
+ }
+
+ export namespace Summary {
+ export type AsObject = {
+ totalWaitingCount: number;
+ totalRunningCount: number;
+ totalStoppedCount: number;
+ };
+ }
}
export class CreateExperimentRequest extends jspb.Message {
@@ -743,6 +817,29 @@ export class CreateExperimentRequest extends jspb.Message {
getEnvironmentId(): string;
setEnvironmentId(value: string): void;
+ getFeatureId(): string;
+ setFeatureId(value: string): void;
+
+ getStartAt(): number;
+ setStartAt(value: number): void;
+
+ getStopAt(): number;
+ setStopAt(value: number): void;
+
+ clearGoalIdsList(): void;
+ getGoalIdsList(): Array;
+ setGoalIdsList(value: Array): void;
+ addGoalIds(value: string, index?: number): string;
+
+ getName(): string;
+ setName(value: string): void;
+
+ getDescription(): string;
+ setDescription(value: string): void;
+
+ getBaseVariationId(): string;
+ setBaseVariationId(value: string): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateExperimentRequest.AsObject;
static toObject(
@@ -768,6 +865,13 @@ export namespace CreateExperimentRequest {
export type AsObject = {
command?: proto_experiment_command_pb.CreateExperimentCommand.AsObject;
environmentId: string;
+ featureId: string;
+ startAt: number;
+ stopAt: number;
+ goalIdsList: Array;
+ name: string;
+ description: string;
+ baseVariationId: string;
};
}
diff --git a/ui/web-v2/src/proto/experiment/service_pb.js b/ui/web-v2/src/proto/experiment/service_pb.js
index 2369eacb9a..7c2e0baaf3 100644
--- a/ui/web-v2/src/proto/experiment/service_pb.js
+++ b/ui/web-v2/src/proto/experiment/service_pb.js
@@ -131,6 +131,11 @@ goog.exportSymbol(
null,
global
);
+goog.exportSymbol(
+ 'proto.bucketeer.experiment.ListExperimentsResponse.Summary',
+ null,
+ global
+);
goog.exportSymbol('proto.bucketeer.experiment.ListGoalsRequest', null, global);
goog.exportSymbol(
'proto.bucketeer.experiment.ListGoalsRequest.OrderBy',
@@ -562,9 +567,43 @@ if (goog.DEBUG && !COMPILED) {
* @extends {jspb.Message}
* @constructor
*/
-proto.bucketeer.experiment.CreateExperimentRequest = function (opt_data) {
+proto.bucketeer.experiment.ListExperimentsResponse.Summary = function (
+ opt_data
+) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
+goog.inherits(
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary,
+ jspb.Message
+);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary.displayName =
+ 'proto.bucketeer.experiment.ListExperimentsResponse.Summary';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.experiment.CreateExperimentRequest = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.experiment.CreateExperimentRequest.repeatedFields_,
+ null
+ );
+};
goog.inherits(proto.bucketeer.experiment.CreateExperimentRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
@@ -1430,7 +1469,8 @@ proto.bucketeer.experiment.ListGoalsRequest.OrderBy = {
DEFAULT: 0,
NAME: 1,
CREATED_AT: 2,
- UPDATED_AT: 3
+ UPDATED_AT: 3,
+ CONNECTION_TYPE: 4
};
/**
@@ -1934,7 +1974,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
environmentId: jspb.Message.getFieldWithDefault(msg, 3, ''),
id: jspb.Message.getFieldWithDefault(msg, 4, ''),
name: jspb.Message.getFieldWithDefault(msg, 5, ''),
- description: jspb.Message.getFieldWithDefault(msg, 6, '')
+ description: jspb.Message.getFieldWithDefault(msg, 6, ''),
+ connectionType: jspb.Message.getFieldWithDefault(msg, 7, 0)
};
if (includeInstance) {
@@ -2000,6 +2041,13 @@ proto.bucketeer.experiment.CreateGoalRequest.deserializeBinaryFromReader =
var value = /** @type {string} */ (reader.readString());
msg.setDescription(value);
break;
+ case 7:
+ var value =
+ /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ reader.readEnum()
+ );
+ msg.setConnectionType(value);
+ break;
default:
reader.skipField();
break;
@@ -2056,6 +2104,10 @@ proto.bucketeer.experiment.CreateGoalRequest.serializeBinaryToWriter =
if (f.length > 0) {
writer.writeString(6, f);
}
+ f = message.getConnectionType();
+ if (f !== 0.0) {
+ writer.writeEnum(7, f);
+ }
};
/**
@@ -2177,6 +2229,26 @@ proto.bucketeer.experiment.CreateGoalRequest.prototype.setDescription =
return jspb.Message.setProto3StringField(this, 6, value);
};
+/**
+ * optional Goal.ConnectionType connection_type = 7;
+ * @return {!proto.bucketeer.experiment.Goal.ConnectionType}
+ */
+proto.bucketeer.experiment.CreateGoalRequest.prototype.getConnectionType =
+ function () {
+ return /** @type {!proto.bucketeer.experiment.Goal.ConnectionType} */ (
+ jspb.Message.getFieldWithDefault(this, 7, 0)
+ );
+ };
+
+/**
+ * @param {!proto.bucketeer.experiment.Goal.ConnectionType} value
+ * @return {!proto.bucketeer.experiment.CreateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.CreateGoalRequest.prototype.setConnectionType =
+ function (value) {
+ return jspb.Message.setProto3EnumField(this, 7, value);
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -3080,7 +3152,16 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
includeInstance,
f
),
- environmentId: jspb.Message.getFieldWithDefault(msg, 5, '')
+ environmentId: jspb.Message.getFieldWithDefault(msg, 5, ''),
+ name:
+ (f = msg.getName()) &&
+ google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f),
+ description:
+ (f = msg.getDescription()) &&
+ google_protobuf_wrappers_pb.StringValue.toObject(includeInstance, f),
+ archived:
+ (f = msg.getArchived()) &&
+ google_protobuf_wrappers_pb.BoolValue.toObject(includeInstance, f)
};
if (includeInstance) {
@@ -3148,6 +3229,30 @@ proto.bucketeer.experiment.UpdateGoalRequest.deserializeBinaryFromReader =
var value = /** @type {string} */ (reader.readString());
msg.setEnvironmentId(value);
break;
+ case 6:
+ var value = new google_protobuf_wrappers_pb.StringValue();
+ reader.readMessage(
+ value,
+ google_protobuf_wrappers_pb.StringValue.deserializeBinaryFromReader
+ );
+ msg.setName(value);
+ break;
+ case 7:
+ var value = new google_protobuf_wrappers_pb.StringValue();
+ reader.readMessage(
+ value,
+ google_protobuf_wrappers_pb.StringValue.deserializeBinaryFromReader
+ );
+ msg.setDescription(value);
+ break;
+ case 8:
+ var value = new google_protobuf_wrappers_pb.BoolValue();
+ reader.readMessage(
+ value,
+ google_protobuf_wrappers_pb.BoolValue.deserializeBinaryFromReader
+ );
+ msg.setArchived(value);
+ break;
default:
reader.skipField();
break;
@@ -3205,6 +3310,30 @@ proto.bucketeer.experiment.UpdateGoalRequest.serializeBinaryToWriter =
if (f.length > 0) {
writer.writeString(5, f);
}
+ f = message.getName();
+ if (f != null) {
+ writer.writeMessage(
+ 6,
+ f,
+ google_protobuf_wrappers_pb.StringValue.serializeBinaryToWriter
+ );
+ }
+ f = message.getDescription();
+ if (f != null) {
+ writer.writeMessage(
+ 7,
+ f,
+ google_protobuf_wrappers_pb.StringValue.serializeBinaryToWriter
+ );
+ }
+ f = message.getArchived();
+ if (f != null) {
+ writer.writeMessage(
+ 8,
+ f,
+ google_protobuf_wrappers_pb.BoolValue.serializeBinaryToWriter
+ );
+ }
};
/**
@@ -3329,6 +3458,131 @@ proto.bucketeer.experiment.UpdateGoalRequest.prototype.setEnvironmentId =
return jspb.Message.setProto3StringField(this, 5, value);
};
+/**
+ * optional google.protobuf.StringValue name = 6;
+ * @return {?proto.google.protobuf.StringValue}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.getName = function () {
+ return /** @type{?proto.google.protobuf.StringValue} */ (
+ jspb.Message.getWrapperField(
+ this,
+ google_protobuf_wrappers_pb.StringValue,
+ 6
+ )
+ );
+};
+
+/**
+ * @param {?proto.google.protobuf.StringValue|undefined} value
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.setName = function (
+ value
+) {
+ return jspb.Message.setWrapperField(this, 6, value);
+};
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.clearName = function () {
+ return this.setName(undefined);
+};
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.hasName = function () {
+ return jspb.Message.getField(this, 6) != null;
+};
+
+/**
+ * optional google.protobuf.StringValue description = 7;
+ * @return {?proto.google.protobuf.StringValue}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.getDescription =
+ function () {
+ return /** @type{?proto.google.protobuf.StringValue} */ (
+ jspb.Message.getWrapperField(
+ this,
+ google_protobuf_wrappers_pb.StringValue,
+ 7
+ )
+ );
+ };
+
+/**
+ * @param {?proto.google.protobuf.StringValue|undefined} value
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.setDescription =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 7, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.clearDescription =
+ function () {
+ return this.setDescription(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.hasDescription =
+ function () {
+ return jspb.Message.getField(this, 7) != null;
+ };
+
+/**
+ * optional google.protobuf.BoolValue archived = 8;
+ * @return {?proto.google.protobuf.BoolValue}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.getArchived =
+ function () {
+ return /** @type{?proto.google.protobuf.BoolValue} */ (
+ jspb.Message.getWrapperField(
+ this,
+ google_protobuf_wrappers_pb.BoolValue,
+ 8
+ )
+ );
+ };
+
+/**
+ * @param {?proto.google.protobuf.BoolValue|undefined} value
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.setArchived = function (
+ value
+) {
+ return jspb.Message.setWrapperField(this, 8, value);
+};
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.experiment.UpdateGoalRequest} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.clearArchived =
+ function () {
+ return this.setArchived(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.experiment.UpdateGoalRequest.prototype.hasArchived =
+ function () {
+ return jspb.Message.getField(this, 8) != null;
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -3365,7 +3619,11 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
msg
) {
var f,
- obj = {};
+ obj = {
+ goal:
+ (f = msg.getGoal()) &&
+ proto_experiment_goal_pb.Goal.toObject(includeInstance, f)
+ };
if (includeInstance) {
obj.$jspbMessageInstance = msg;
@@ -3405,6 +3663,14 @@ proto.bucketeer.experiment.UpdateGoalResponse.deserializeBinaryFromReader =
}
var field = reader.getFieldNumber();
switch (field) {
+ case 1:
+ var value = new proto_experiment_goal_pb.Goal();
+ reader.readMessage(
+ value,
+ proto_experiment_goal_pb.Goal.deserializeBinaryFromReader
+ );
+ msg.setGoal(value);
+ break;
default:
reader.skipField();
break;
@@ -3437,8 +3703,53 @@ proto.bucketeer.experiment.UpdateGoalResponse.prototype.serializeBinary =
proto.bucketeer.experiment.UpdateGoalResponse.serializeBinaryToWriter =
function (message, writer) {
var f = undefined;
+ f = message.getGoal();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto_experiment_goal_pb.Goal.serializeBinaryToWriter
+ );
+ }
+ };
+
+/**
+ * optional Goal goal = 1;
+ * @return {?proto.bucketeer.experiment.Goal}
+ */
+proto.bucketeer.experiment.UpdateGoalResponse.prototype.getGoal = function () {
+ return /** @type{?proto.bucketeer.experiment.Goal} */ (
+ jspb.Message.getWrapperField(this, proto_experiment_goal_pb.Goal, 1)
+ );
+};
+
+/**
+ * @param {?proto.bucketeer.experiment.Goal|undefined} value
+ * @return {!proto.bucketeer.experiment.UpdateGoalResponse} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalResponse.prototype.setGoal = function (
+ value
+) {
+ return jspb.Message.setWrapperField(this, 1, value);
+};
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.experiment.UpdateGoalResponse} returns this
+ */
+proto.bucketeer.experiment.UpdateGoalResponse.prototype.clearGoal =
+ function () {
+ return this.setGoal(undefined);
};
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.experiment.UpdateGoalResponse.prototype.hasGoal = function () {
+ return jspb.Message.getField(this, 1) != null;
+};
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -4492,7 +4803,13 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
includeInstance
),
cursor: jspb.Message.getFieldWithDefault(msg, 2, ''),
- totalCount: jspb.Message.getFieldWithDefault(msg, 3, 0)
+ totalCount: jspb.Message.getFieldWithDefault(msg, 3, 0),
+ summary:
+ (f = msg.getSummary()) &&
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary.toObject(
+ includeInstance,
+ f
+ )
};
if (includeInstance) {
@@ -4549,12 +4866,22 @@ proto.bucketeer.experiment.ListExperimentsResponse.deserializeBinaryFromReader =
var value = /** @type {number} */ (reader.readInt64());
msg.setTotalCount(value);
break;
- default:
- reader.skipField();
- break;
- }
- }
- return msg;
+ case 4:
+ var value =
+ new proto.bucketeer.experiment.ListExperimentsResponse.Summary();
+ reader.readMessage(
+ value,
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary
+ .deserializeBinaryFromReader
+ );
+ msg.setSummary(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
};
/**
@@ -4597,6 +4924,203 @@ proto.bucketeer.experiment.ListExperimentsResponse.serializeBinaryToWriter =
if (f !== 0) {
writer.writeInt64(3, f);
}
+ f = message.getSummary();
+ if (f != null) {
+ writer.writeMessage(
+ 4,
+ f,
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary
+ .serializeBinaryToWriter
+ );
+ }
+ };
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.toObject =
+ function (opt_includeInstance) {
+ return proto.bucketeer.experiment.ListExperimentsResponse.Summary.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary.toObject =
+ function (includeInstance, msg) {
+ var f,
+ obj = {
+ totalWaitingCount: jspb.Message.getFieldWithDefault(msg, 1, 0),
+ totalRunningCount: jspb.Message.getFieldWithDefault(msg, 2, 0),
+ totalStoppedCount: jspb.Message.getFieldWithDefault(msg, 3, 0)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse.Summary}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.deserializeBinary =
+ function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.experiment.ListExperimentsResponse.Summary();
+ return proto.bucketeer.experiment.ListExperimentsResponse.Summary.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+ };
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse.Summary}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.deserializeBinaryFromReader =
+ function (msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setTotalWaitingCount(value);
+ break;
+ case 2:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setTotalRunningCount(value);
+ break;
+ case 3:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setTotalStoppedCount(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+ };
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.serializeBinary =
+ function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary.serializeBinaryToWriter(
+ this,
+ writer
+ );
+ return writer.getResultBuffer();
+ };
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.serializeBinaryToWriter =
+ function (message, writer) {
+ var f = undefined;
+ f = message.getTotalWaitingCount();
+ if (f !== 0) {
+ writer.writeInt64(1, f);
+ }
+ f = message.getTotalRunningCount();
+ if (f !== 0) {
+ writer.writeInt64(2, f);
+ }
+ f = message.getTotalStoppedCount();
+ if (f !== 0) {
+ writer.writeInt64(3, f);
+ }
+ };
+
+/**
+ * optional int64 total_waiting_count = 1;
+ * @return {number}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.getTotalWaitingCount =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} returns this
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.setTotalWaitingCount =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 1, value);
+ };
+
+/**
+ * optional int64 total_running_count = 2;
+ * @return {number}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.getTotalRunningCount =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} returns this
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.setTotalRunningCount =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 2, value);
+ };
+
+/**
+ * optional int64 total_stopped_count = 3;
+ * @return {number}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.getTotalStoppedCount =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse.Summary} returns this
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.Summary.prototype.setTotalStoppedCount =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 3, value);
};
/**
@@ -4686,6 +5210,55 @@ proto.bucketeer.experiment.ListExperimentsResponse.prototype.setTotalCount =
return jspb.Message.setProto3IntField(this, 3, value);
};
+/**
+ * optional Summary summary = 4;
+ * @return {?proto.bucketeer.experiment.ListExperimentsResponse.Summary}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.prototype.getSummary =
+ function () {
+ return /** @type{?proto.bucketeer.experiment.ListExperimentsResponse.Summary} */ (
+ jspb.Message.getWrapperField(
+ this,
+ proto.bucketeer.experiment.ListExperimentsResponse.Summary,
+ 4
+ )
+ );
+ };
+
+/**
+ * @param {?proto.bucketeer.experiment.ListExperimentsResponse.Summary|undefined} value
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse} returns this
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.prototype.setSummary =
+ function (value) {
+ return jspb.Message.setWrapperField(this, 4, value);
+ };
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.bucketeer.experiment.ListExperimentsResponse} returns this
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.prototype.clearSummary =
+ function () {
+ return this.setSummary(undefined);
+ };
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.bucketeer.experiment.ListExperimentsResponse.prototype.hasSummary =
+ function () {
+ return jspb.Message.getField(this, 4) != null;
+ };
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.repeatedFields_ = [7];
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@@ -4728,7 +5301,15 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
includeInstance,
f
),
- environmentId: jspb.Message.getFieldWithDefault(msg, 3, '')
+ environmentId: jspb.Message.getFieldWithDefault(msg, 3, ''),
+ featureId: jspb.Message.getFieldWithDefault(msg, 4, ''),
+ startAt: jspb.Message.getFieldWithDefault(msg, 5, 0),
+ stopAt: jspb.Message.getFieldWithDefault(msg, 6, 0),
+ goalIdsList:
+ (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f,
+ name: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ description: jspb.Message.getFieldWithDefault(msg, 9, ''),
+ baseVariationId: jspb.Message.getFieldWithDefault(msg, 10, '')
};
if (includeInstance) {
@@ -4781,6 +5362,34 @@ proto.bucketeer.experiment.CreateExperimentRequest.deserializeBinaryFromReader =
var value = /** @type {string} */ (reader.readString());
msg.setEnvironmentId(value);
break;
+ case 4:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setFeatureId(value);
+ break;
+ case 5:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setStartAt(value);
+ break;
+ case 6:
+ var value = /** @type {number} */ (reader.readInt64());
+ msg.setStopAt(value);
+ break;
+ case 7:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addGoalIds(value);
+ break;
+ case 8:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ case 9:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setDescription(value);
+ break;
+ case 10:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setBaseVariationId(value);
+ break;
default:
reader.skipField();
break;
@@ -4826,6 +5435,34 @@ proto.bucketeer.experiment.CreateExperimentRequest.serializeBinaryToWriter =
if (f.length > 0) {
writer.writeString(3, f);
}
+ f = message.getFeatureId();
+ if (f.length > 0) {
+ writer.writeString(4, f);
+ }
+ f = message.getStartAt();
+ if (f !== 0) {
+ writer.writeInt64(5, f);
+ }
+ f = message.getStopAt();
+ if (f !== 0) {
+ writer.writeInt64(6, f);
+ }
+ f = message.getGoalIdsList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(7, f);
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(8, f);
+ }
+ f = message.getDescription();
+ if (f.length > 0) {
+ writer.writeString(9, f);
+ }
+ f = message.getBaseVariationId();
+ if (f.length > 0) {
+ writer.writeString(10, f);
+ }
};
/**
@@ -4890,6 +5527,161 @@ proto.bucketeer.experiment.CreateExperimentRequest.prototype.setEnvironmentId =
return jspb.Message.setProto3StringField(this, 3, value);
};
+/**
+ * optional string feature_id = 4;
+ * @return {string}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getFeatureId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 4, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setFeatureId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 4, value);
+ };
+
+/**
+ * optional int64 start_at = 5;
+ * @return {number}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getStartAt =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setStartAt =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 5, value);
+ };
+
+/**
+ * optional int64 stop_at = 6;
+ * @return {number}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getStopAt =
+ function () {
+ return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
+ };
+
+/**
+ * @param {number} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setStopAt =
+ function (value) {
+ return jspb.Message.setProto3IntField(this, 6, value);
+ };
+
+/**
+ * repeated string goal_ids = 7;
+ * @return {!Array}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getGoalIdsList =
+ function () {
+ return /** @type {!Array} */ (
+ jspb.Message.getRepeatedField(this, 7)
+ );
+ };
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setGoalIdsList =
+ function (value) {
+ return jspb.Message.setField(this, 7, value || []);
+ };
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.addGoalIds =
+ function (value, opt_index) {
+ return jspb.Message.addToRepeatedField(this, 7, value, opt_index);
+ };
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.clearGoalIdsList =
+ function () {
+ return this.setGoalIdsList([]);
+ };
+
+/**
+ * optional string name = 8;
+ * @return {string}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getName =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 8, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setName =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 8, value);
+ };
+
+/**
+ * optional string description = 9;
+ * @return {string}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getDescription =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 9, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setDescription =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 9, value);
+ };
+
+/**
+ * optional string base_variation_id = 10;
+ * @return {string}
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.getBaseVariationId =
+ function () {
+ return /** @type {string} */ (
+ jspb.Message.getFieldWithDefault(this, 10, '')
+ );
+ };
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.experiment.CreateExperimentRequest} returns this
+ */
+proto.bucketeer.experiment.CreateExperimentRequest.prototype.setBaseVariationId =
+ function (value) {
+ return jspb.Message.setProto3StringField(this, 10, value);
+ };
+
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
diff --git a/ui/web-v2/src/proto/notification/subscription_pb.d.ts b/ui/web-v2/src/proto/notification/subscription_pb.d.ts
index a367035d52..d219c29f58 100644
--- a/ui/web-v2/src/proto/notification/subscription_pb.d.ts
+++ b/ui/web-v2/src/proto/notification/subscription_pb.d.ts
@@ -98,6 +98,7 @@ export namespace Subscription {
DOMAIN_EVENT_ORGANIZATION: 15;
DOMAIN_EVENT_FLAG_TRIGGER: 16;
DOMAIN_EVENT_TAG: 17;
+ DOMAIN_EVENT_CODEREF: 18;
FEATURE_STALE: 100;
EXPERIMENT_RUNNING: 200;
MAU_COUNT: 300;
diff --git a/ui/web-v2/src/proto/notification/subscription_pb.js b/ui/web-v2/src/proto/notification/subscription_pb.js
index ff31aae255..9c66209a9e 100644
--- a/ui/web-v2/src/proto/notification/subscription_pb.js
+++ b/ui/web-v2/src/proto/notification/subscription_pb.js
@@ -304,6 +304,7 @@ proto.bucketeer.notification.Subscription.SourceType = {
DOMAIN_EVENT_ORGANIZATION: 15,
DOMAIN_EVENT_FLAG_TRIGGER: 16,
DOMAIN_EVENT_TAG: 17,
+ DOMAIN_EVENT_CODEREF: 18,
FEATURE_STALE: 100,
EXPERIMENT_RUNNING: 200,
MAU_COUNT: 300
diff --git a/ui/web-v2/src/proto/tag/service_pb.d.ts b/ui/web-v2/src/proto/tag/service_pb.d.ts
index 64172b46ee..f564cd2ac8 100644
--- a/ui/web-v2/src/proto/tag/service_pb.d.ts
+++ b/ui/web-v2/src/proto/tag/service_pb.d.ts
@@ -4,6 +4,7 @@
import * as jspb from 'google-protobuf';
import * as google_api_annotations_pb from '../../google/api/annotations_pb';
import * as google_api_field_behavior_pb from '../../google/api/field_behavior_pb';
+import * as google_protobuf_wrappers_pb from 'google-protobuf/google/protobuf/wrappers_pb';
import * as protoc_gen_openapiv2_options_annotations_pb from '../../protoc-gen-openapiv2/options/annotations_pb';
import * as proto_tag_tag_pb from '../../proto/tag/tag_pb';
@@ -168,6 +169,11 @@ export class ListTagsRequest extends jspb.Message {
getOrganizationId(): string;
setOrganizationId(value: string): void;
+ getEntityType(): proto_tag_tag_pb.Tag.EntityTypeMap[keyof proto_tag_tag_pb.Tag.EntityTypeMap];
+ setEntityType(
+ value: proto_tag_tag_pb.Tag.EntityTypeMap[keyof proto_tag_tag_pb.Tag.EntityTypeMap]
+ ): void;
+
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListTagsRequest.AsObject;
static toObject(
@@ -198,6 +204,7 @@ export namespace ListTagsRequest {
searchKeyword: string;
environmentId: string;
organizationId: string;
+ entityType: proto_tag_tag_pb.Tag.EntityTypeMap[keyof proto_tag_tag_pb.Tag.EntityTypeMap];
};
export interface OrderByMap {
diff --git a/ui/web-v2/src/proto/tag/service_pb.js b/ui/web-v2/src/proto/tag/service_pb.js
index 672edd4b18..5780fdcf6a 100644
--- a/ui/web-v2/src/proto/tag/service_pb.js
+++ b/ui/web-v2/src/proto/tag/service_pb.js
@@ -27,6 +27,8 @@ var google_api_annotations_pb = require('../../google/api/annotations_pb.js');
goog.object.extend(proto, google_api_annotations_pb);
var google_api_field_behavior_pb = require('../../google/api/field_behavior_pb.js');
goog.object.extend(proto, google_api_field_behavior_pb);
+var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js');
+goog.object.extend(proto, google_protobuf_wrappers_pb);
var protoc$gen$openapiv2_options_annotations_pb = require('../../protoc-gen-openapiv2/options/annotations_pb.js');
goog.object.extend(proto, protoc$gen$openapiv2_options_annotations_pb);
var proto_tag_tag_pb = require('../../proto/tag/tag_pb.js');
@@ -845,7 +847,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) {
orderDirection: jspb.Message.getFieldWithDefault(msg, 5, 0),
searchKeyword: jspb.Message.getFieldWithDefault(msg, 6, ''),
environmentId: jspb.Message.getFieldWithDefault(msg, 7, ''),
- organizationId: jspb.Message.getFieldWithDefault(msg, 8, '')
+ organizationId: jspb.Message.getFieldWithDefault(msg, 8, ''),
+ entityType: jspb.Message.getFieldWithDefault(msg, 9, 0)
};
if (includeInstance) {
@@ -920,6 +923,12 @@ proto.bucketeer.tag.ListTagsRequest.deserializeBinaryFromReader = function (
var value = /** @type {string} */ (reader.readString());
msg.setOrganizationId(value);
break;
+ case 9:
+ var value = /** @type {!proto.bucketeer.tag.Tag.EntityType} */ (
+ reader.readEnum()
+ );
+ msg.setEntityType(value);
+ break;
default:
reader.skipField();
break;
@@ -978,6 +987,10 @@ proto.bucketeer.tag.ListTagsRequest.serializeBinaryToWriter = function (
if (f.length > 0) {
writer.writeString(8, f);
}
+ f = message.getEntityType();
+ if (f !== 0.0) {
+ writer.writeEnum(9, f);
+ }
};
/**
@@ -1124,6 +1137,24 @@ proto.bucketeer.tag.ListTagsRequest.prototype.setOrganizationId = function (
return jspb.Message.setProto3StringField(this, 8, value);
};
+/**
+ * optional Tag.EntityType entity_type = 9;
+ * @return {!proto.bucketeer.tag.Tag.EntityType}
+ */
+proto.bucketeer.tag.ListTagsRequest.prototype.getEntityType = function () {
+ return /** @type {!proto.bucketeer.tag.Tag.EntityType} */ (
+ jspb.Message.getFieldWithDefault(this, 9, 0)
+ );
+};
+
+/**
+ * @param {!proto.bucketeer.tag.Tag.EntityType} value
+ * @return {!proto.bucketeer.tag.ListTagsRequest} returns this
+ */
+proto.bucketeer.tag.ListTagsRequest.prototype.setEntityType = function (value) {
+ return jspb.Message.setProto3EnumField(this, 9, value);
+};
+
/**
* List of repeated fields within this message type.
* @private {!Array}
diff --git a/ui/web-v2/src/proto/tag/tag_pb.d.ts b/ui/web-v2/src/proto/tag/tag_pb.d.ts
index 58fa82654a..4ea16c48a1 100644
--- a/ui/web-v2/src/proto/tag/tag_pb.d.ts
+++ b/ui/web-v2/src/proto/tag/tag_pb.d.ts
@@ -48,10 +48,47 @@ export namespace Tag {
};
export interface EntityTypeMap {
- UNKNOWN: 0;
+ UNSPECIFIED: 0;
FEATURE_FLAG: 1;
ACCOUNT: 2;
}
export const EntityType: EntityTypeMap;
}
+
+export class EnvironmentTag extends jspb.Message {
+ getEnvironmentId(): string;
+ setEnvironmentId(value: string): void;
+
+ clearTagsList(): void;
+ getTagsList(): Array;
+ setTagsList(value: Array): void;
+ addTags(value?: Tag, index?: number): Tag;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): EnvironmentTag.AsObject;
+ static toObject(
+ includeInstance: boolean,
+ msg: EnvironmentTag
+ ): EnvironmentTag.AsObject;
+ static extensions: { [key: number]: jspb.ExtensionFieldInfo };
+ static extensionsBinary: {
+ [key: number]: jspb.ExtensionFieldBinaryInfo;
+ };
+ static serializeBinaryToWriter(
+ message: EnvironmentTag,
+ writer: jspb.BinaryWriter
+ ): void;
+ static deserializeBinary(bytes: Uint8Array): EnvironmentTag;
+ static deserializeBinaryFromReader(
+ message: EnvironmentTag,
+ reader: jspb.BinaryReader
+ ): EnvironmentTag;
+}
+
+export namespace EnvironmentTag {
+ export type AsObject = {
+ environmentId: string;
+ tagsList: Array;
+ };
+}
diff --git a/ui/web-v2/src/proto/tag/tag_pb.js b/ui/web-v2/src/proto/tag/tag_pb.js
index 2346b9bcb1..d6102a4ec6 100644
--- a/ui/web-v2/src/proto/tag/tag_pb.js
+++ b/ui/web-v2/src/proto/tag/tag_pb.js
@@ -23,6 +23,7 @@ var global =
}.call(null) ||
Function('return this')();
+goog.exportSymbol('proto.bucketeer.tag.EnvironmentTag', null, global);
goog.exportSymbol('proto.bucketeer.tag.Tag', null, global);
goog.exportSymbol('proto.bucketeer.tag.Tag.EntityType', null, global);
/**
@@ -46,6 +47,35 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.bucketeer.tag.Tag.displayName = 'proto.bucketeer.tag.Tag';
}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.bucketeer.tag.EnvironmentTag = function (opt_data) {
+ jspb.Message.initialize(
+ this,
+ opt_data,
+ 0,
+ -1,
+ proto.bucketeer.tag.EnvironmentTag.repeatedFields_,
+ null
+ );
+};
+goog.inherits(proto.bucketeer.tag.EnvironmentTag, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.bucketeer.tag.EnvironmentTag.displayName =
+ 'proto.bucketeer.tag.EnvironmentTag';
+}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
@@ -199,7 +229,7 @@ proto.bucketeer.tag.Tag.serializeBinaryToWriter = function (message, writer) {
* @enum {number}
*/
proto.bucketeer.tag.Tag.EntityType = {
- UNKNOWN: 0,
+ UNSPECIFIED: 0,
FEATURE_FLAG: 1,
ACCOUNT: 2
};
@@ -302,4 +332,212 @@ proto.bucketeer.tag.Tag.prototype.setEnvironmentId = function (value) {
return jspb.Message.setProto3StringField(this, 6, value);
};
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.bucketeer.tag.EnvironmentTag.repeatedFields_ = [2];
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+ /**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+ proto.bucketeer.tag.EnvironmentTag.prototype.toObject = function (
+ opt_includeInstance
+ ) {
+ return proto.bucketeer.tag.EnvironmentTag.toObject(
+ opt_includeInstance,
+ this
+ );
+ };
+
+ /**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.bucketeer.tag.EnvironmentTag} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+ proto.bucketeer.tag.EnvironmentTag.toObject = function (
+ includeInstance,
+ msg
+ ) {
+ var f,
+ obj = {
+ environmentId: jspb.Message.getFieldWithDefault(msg, 1, ''),
+ tagsList: jspb.Message.toObjectList(
+ msg.getTagsList(),
+ proto.bucketeer.tag.Tag.toObject,
+ includeInstance
+ )
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+ };
+}
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.bucketeer.tag.EnvironmentTag}
+ */
+proto.bucketeer.tag.EnvironmentTag.deserializeBinary = function (bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.bucketeer.tag.EnvironmentTag();
+ return proto.bucketeer.tag.EnvironmentTag.deserializeBinaryFromReader(
+ msg,
+ reader
+ );
+};
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.bucketeer.tag.EnvironmentTag} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.bucketeer.tag.EnvironmentTag}
+ */
+proto.bucketeer.tag.EnvironmentTag.deserializeBinaryFromReader = function (
+ msg,
+ reader
+) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEnvironmentId(value);
+ break;
+ case 2:
+ var value = new proto.bucketeer.tag.Tag();
+ reader.readMessage(
+ value,
+ proto.bucketeer.tag.Tag.deserializeBinaryFromReader
+ );
+ msg.addTags(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.serializeBinary = function () {
+ var writer = new jspb.BinaryWriter();
+ proto.bucketeer.tag.EnvironmentTag.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.bucketeer.tag.EnvironmentTag} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.bucketeer.tag.EnvironmentTag.serializeBinaryToWriter = function (
+ message,
+ writer
+) {
+ var f = undefined;
+ f = message.getEnvironmentId();
+ if (f.length > 0) {
+ writer.writeString(1, f);
+ }
+ f = message.getTagsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 2,
+ f,
+ proto.bucketeer.tag.Tag.serializeBinaryToWriter
+ );
+ }
+};
+
+/**
+ * optional string environment_id = 1;
+ * @return {string}
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.getEnvironmentId = function () {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ''));
+};
+
+/**
+ * @param {string} value
+ * @return {!proto.bucketeer.tag.EnvironmentTag} returns this
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.setEnvironmentId = function (
+ value
+) {
+ return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+/**
+ * repeated Tag tags = 2;
+ * @return {!Array}
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.getTagsList = function () {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.bucketeer.tag.Tag, 2)
+ );
+};
+
+/**
+ * @param {!Array} value
+ * @return {!proto.bucketeer.tag.EnvironmentTag} returns this
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.setTagsList = function (value) {
+ return jspb.Message.setRepeatedWrapperField(this, 2, value);
+};
+
+/**
+ * @param {!proto.bucketeer.tag.Tag=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.bucketeer.tag.Tag}
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.addTags = function (
+ opt_value,
+ opt_index
+) {
+ return jspb.Message.addToRepeatedWrapperField(
+ this,
+ 2,
+ opt_value,
+ proto.bucketeer.tag.Tag,
+ opt_index
+ );
+};
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.bucketeer.tag.EnvironmentTag} returns this
+ */
+proto.bucketeer.tag.EnvironmentTag.prototype.clearTagsList = function () {
+ return this.setTagsList([]);
+};
+
goog.object.extend(exports, proto.bucketeer.tag);